我的quicksort实施给出了错误的结果

时间:2018-12-01 18:08:01

标签: c quicksort

今天,我一直在研究用C语言实现Quicksort算法。 我以为我已经完全理解了这个问题,但是经过几次尝试,结果却与我预期的不同。我请求您帮助发现问题,因为我自己找不到问题,我什至尝试查看Internet上的另一种实现并重写我的功能,但没有任何效果。 我的代码:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

void swap(int *x, int *y)
{
    int temp = *y;
    *x = *y;
    *y = temp;
}

void printArray(int arr[], int size)
{
    for(int i = 0; i < size; i++)
    {
        printf("%d ", arr[i]);
    }
    printf("\n");

}

int partition(int arr[], int low, int high)
{
    int pivot = arr[high];
    int i = (low - 1);
    for(int j = low; j <= high-1; j++)
    {
        if(arr[j] <= pivot)
        {
            i++;
            swap(&arr[i], &arr[j]);
        }
    }
    swap(&arr[i+1], &arr[high]);
    return(i+1);
}

void quickSort(int arr[], int low, int high)
{
    if(low < high)
    {
        int pi = partition(arr, low, high);
        quickSort(arr, low, pi-1);
        quickSort(arr, pi + 1, high);
    }
}


int main()
{
    srand(time(NULL));
    int arr[10];
    for(int i = 0;  i < 10; i++)
    {
        arr[i] = rand()%200 - 100;
    }

    printArray(arr, 10);
    quickSort(arr, 0, 9);
    printArray(arr, 10);
    return 0;
}

示例性结果:

-57 4 -30 -23 25 -67 83 26 -51 14 
-67 -67 -51 -67 -51 -51 14 -51 14 14

1 个答案:

答案 0 :(得分:1)

快速排序的唯一问题是交换功能未正确实现。

正确的实现应类似于:

void swap(int *x, int *y) {
    int temp = *x;
    *x = *y;
    *y = temp;
}

您可能会对其他快速排序变体感兴趣,请参阅this

一个卑微的建议:使用随机快速排序:如果您不总是选择最后一个元素作为枢轴,这也将更好(您可以在开始对select进行排序之前进行此操作)任何随机元素,然后将其与数组的最后一个元素交换。使用此策略,您无需在现有代码中进行太多更改)选择随机元素作为枢轴要好得多。有关更多详细信息,请参见this链接。