Quicksort C - 一个不同的版本

时间:2017-03-21 22:36:19

标签: c algorithm quicksort

代码确实运行了。这是我正在研究的快速排序的一个不同版本。我遇到了一些重大问题。首先它将数组中的第一个元素打印为n:例如(如果你设置n = 3,即使你让数组1中的第一个元素让我们说,它仍然会打印出3作为第一个元素)。此外,当您打印出排序版本时,它实际上并没有改变任何内容。

n = 3,

的输入示例

设定值= 8,7,6

初始输出将等于3,7,6

最终输出将等于3,7,6

(输出应该是6,7,8)

我还没能在网上找到与我的代码类似的任何代码,所以这可能是新的!感谢。

//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;

}

1 个答案:

答案 0 :(得分:0)

这是一个评论很多的答案。我更改了代码。

现在这是一个用于用户输入的功能齐全的快速排序数组。

我之前遇到的问题是&amp; array [MAX_ARRAY_SIZE]。这需要改为&#34; array&#34;代替。 &amp;数组[MAX_ARRAY_SIZE]试图访问超过数组实际大小的内存位置。

将其更改为&#34; array&#34;意味着它正在访问数组中的第一个元素。(如果错误则更正)

我还将populate数组函数更改为强大的do-while循环。而不是试图重新调用内部的功能。 do-while循环只允许您更改&#39; n&#39;的值。

 Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click

    Dim xlApp As Excel.Application
    Dim xlWorkBook As Excel.Workbook
    Dim xlWorkSheet As Excel.Worksheet
    Dim misValue As Object = System.Reflection.Missing.Value


    xlApp = New Excel.Application
    xlWorkBook = xlApp.Workbooks.Add(misValue)
    xlWorkSheet = xlWorkBook.Sheets("Sheet1")

    xlWorkSheet.SaveAs("C:\Masterlist.xlsx")
    xlWorkBook.Close()
    xlApp.Quit()

    releaseObject(xlApp)
    releaseObject(xlWorkBook)
    releaseObject(xlWorkSheet)

    MsgBox("You can find the file in C:\Masterlist.xlsx")
End Sub