简体   繁体   English

Quicksort C - 一个不同的版本

[英]Quicksort C - A little different version

The code does run. 代码确实运行。 This is a little different version of quicksort I am working on. 这是我正在研究的快速排序的一个不同版本。 I am running into some major issues with it. 我遇到了一些重大问题。 First off It prints out the first element in the array as n: for example(if you set n = 3, even if you make the first element in the array 1 lets say, it will still print out 3 as the first element). 首先它将数组中的第一个元素打印为n:例如(如果你设置n = 3,即使你让数组1中的第一个元素让我们说,它仍然会打印出3作为第一个元素)。 Also when you print out the sorted version it doesn't actually change anything. 此外,当您打印出排序版本时,它实际上并没有改变任何东西。

Example input with n = 3, n = 3的示例输入,

Set values = 8 , 7 , 6 设定值= 8,7,6

Initial output will equal 3 , 7 , 6 初始输出将等于3,7,6

Final output will equal 3 , 7 , 6 最终输出将等于3,7,6

(The output SHOULD be 6 , 7 , 8) (输出应该是6,7,8)

I haven't been able to find any code online similar to my code, so this may be something new! 我无法在网上找到任何类似于我的代码的代码,所以这可能是新的! Thanks. 谢谢。

//preprocessor directives and header files
#include <stdio.h>
#define MAX_ARRAY_SIZE 50

//function prototypes separated by data types
void print_array( int array[], int n );              // Print out the array values
void swap( int array[], int index1, int index2 );    // Swap two array elements. 
void quicksort( int array[], int low, int high );    // Sorting algorithm

int populate_array( int array[] );                  // Fill array with values from user.
int partition( int array[], int low, int high );    // Find the partition point (pivot)

//the main function 
int main(void)
{
    int array[MAX_ARRAY_SIZE];
    //set n = to size of user created size of array

    int n = populate_array(&array[MAX_ARRAY_SIZE]);
    //print the original array to the screen
    print_array(&array[MAX_ARRAY_SIZE], n );
    //perform the algorithm
    quicksort(array, 0, n-1);

    printf("The array is now sorted:\n");
    print_array(&array[MAX_ARRAY_SIZE], n);
    return 0;
}
// *array and array[] are the same...
int populate_array(int array[])
{
    int n = -1;
    printf("Enter the value of n > ");
    scanf("%d", &n);

    if(n > MAX_ARRAY_SIZE)
    {
        printf("%d exceeds the maximum array size. Please try again.\n\n", n);
        populate_array( &array[MAX_ARRAY_SIZE]);
    }
    else if(n < 0)
    {
        printf("%d is less than zero. Please try again.\n\n", n);
        populate_array( &array[MAX_ARRAY_SIZE]);
    }
    else if(n == 0)
    {
        printf("%d Array of size 0? Please don't try this, and... Please try again.\n\n", n);
        populate_array( &array[MAX_ARRAY_SIZE]);
    }
    else
    {
        for(int i = 0; i < n; i++)
            scanf("%d", &array[i]);
    }
    printf("The initial array contains: \n");
    return n;
}

void print_array(int array[], int n)
{

    for(int i = 0; i < n; i++)
        printf("%+5d\n", array[i]);


}

void quicksort(int array[], int low, int high)
{

    if (low < high)
    {
        /* pivot is partitioning index, array[p] is now
           at right place */
        int pivot = partition(array, low, high);

        // Separately sort elements before
        // partition and after partition
        quicksort(array, low, pivot - 1);
        quicksort(array, pivot + 1, high);
    }

}

int partition(int array[], int low, int high)
{
    int pivot = array[high];

    int i = low;
    for (int j = low; j <= high- 1; j++)
    {
        // If current element is smaller than or
        // equal to pivot
        if (array[j] <= pivot)
        {
            swap(array, i, j);
            i = i +1;
        }
    }
    swap(array, i, high);
    return i;
}

void swap(int array[], int index1, int index2)
{
    int temp = array[index1];
    array[index1] = array[index2];
    array[index2] = temp;

}

Here is a heavily commented answer. 这是一个评论很多的答案。 I changed the code quite a bit. 我改变了相当多的代码。

This is now a fully functional quicksort array for user input. 现在,这是一个用于用户输入的功能齐全的快速排序数组。

The problem I was having before was with the &array[MAX_ARRAY_SIZE]. 我之前遇到的问题是&array [MAX_ARRAY_SIZE]。 This needed to be changed to just "array" instead. 这需要改为只是“数组”。 The &array[MAX_ARRAY_SIZE] was trying to access a memory location past the actual size of the array. &array [MAX_ARRAY_SIZE]试图访问超过数组实际大小的内存位置。

Changing it to just "array" means that it is accessing the first element in the array.(Correct if wrong) 将它更改为“数组”意味着它正在访问数组中的第一个元素。(如果错误则更正)

I also changed the populate array function to be a robust do-while loop. 我还将populate数组函数更改为一个强大的do-while循环。 And instead of trying to re-call the function inside itself. 而不是试图重新调用内部的功能。 The do-while loop will only allow you to change the value of 'n'. do-while循环只允许你改变'n'的值。

/*
Author: Zachary Alberda
*/
//preprocessor directives and header files
#include <stdio.h>
#define MAX_ARRAY_SIZE 50

//function prototypes separated by data types
void print_array( int array[], int n );              // Print out the array values
void swap( int array[], int index1, int index2 );    // Swap two array elements. 
void quicksort( int array[], int low, int high );    // Sorting algorithm

int populate_array( int array[] );                  // Fill array with values from user.
int partition( int array[], int low, int high );    // Find the partition point (pivot)

//the main function 
int main(void)
{
    int array[MAX_ARRAY_SIZE]; //set n = to size of user created size of array

    int n = populate_array(array); //print the original array to the screen

    print_array(array, n ); //print array of size n 

    quicksort(array, 0, n-1); //perform the algorithm low is 0, high is size of array -1.

    printf("The array is now sorted:\n");//Inform user that the array is sorted.

    print_array(array, n);//print the sorted array

    return 0; // exit without errors.
}
// *array and array[] are the same...
int populate_array(int array[])
{

    int n = -1;//initialize variable n(local variable to function populate_array)
    printf("Enter the value of n > ");//inform user of what to input
    scanf("%d", &n);

    /*
        CHECK IF N IS VALID 


        This is a robust do while loop!

        1) Performs the if-statements while 'n' is not valid in a do-while loop.
         -The reason I do this is because it will cause errors
            if the if-statements are individual without the do-while loop.
        2)The program will not crash if you try different combinations
            of inputs for 'n'. :) 
        3)Checks if user input is > MAX_ARRAY_SIZE
        4)Checks if user input is < 0
        5)Checks if user input is == 0
    */
    do
    {
        if(n > MAX_ARRAY_SIZE)
        {
            printf("%d exceeds the maximum array size. Please try again.\n\n", n);
            printf("Enter the value of n > ");
            scanf("%d", &n);
        }
        else if(n < 0)
        {
            printf("%d is less than zero. Please try again.\n\n", n);
            printf("Enter the value of n > ");
            scanf("%d", &n);
        }
        else if(n == 0)
        {
            printf("%d Array of size 0? Please don't try this, and... Please try again.\n\n", n);
            printf("Enter the value of n > ");
            scanf("%d", &n);
        }
    }while(n <= 0 || n > MAX_ARRAY_SIZE);

    //scan in array if user input is valid 
    for(int i = 0; i < n; i++)
        scanf("%d", &array[i]);

    printf("The initial array contains: \n");//Inform user of initial array

    return n;
}

void print_array(int array[], int n)
{
//print array in pre/post order before and after the algorithm.
    for(int i = 0; i < n; i++)
        printf("%+5d\n", array[i]);


}

void quicksort(int array[], int low, int high)
{

    if (low < high)
    {
        /* pivot is partitioning index, array[pivot] is now
           at right place */
        int pivot = partition(array, low, high);

        // Separately sort elements before
        // partition and after partition
        quicksort(array, low, pivot - 1);
        quicksort(array, pivot + 1, high);
    }

}

int partition(int array[], int low, int high)
{
    int pivot = array[high];

    int i = low;

    for (int j = low; j <= high- 1; j++)
    {
        // If current element is smaller than or
        // equal to pivot
        if (array[j] <= pivot)
        {
            swap(array, i, j);
            i = i +1;
        }
    }
    swap(array, i, high);
    return i;
}

void swap(int array[], int index1, int index2)
{
    //swap positions of array index 1 and 2 
    int temp = array[index1];
    array[index1] = array[index2];
    array[index2] = temp;

}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM