这个快速排序计划有什么问题?

时间:2013-10-18 20:23:32

标签: c quicksort

我已编写以下程序进行快速排序。但是,它似乎没有起作用。有人能指出这个程序有什么问题吗?

#include<stdio.h>

void swap (int a[], int left, int right) {
    int temp;
    temp=a[left];
    a[left]=a[right];
    a[right]=temp;
} 

void printarray(int a[], int);
void partition( int a[], int low, int high );

void quicksort( int a[], int low, int high ) {
    srand((unsigned int)time(0));
    partition( a, low, high );
} 

void partition( int a[], int low, int high ) {
    int left, right;
    int pivot_item, pivot;

    left = low;
    right = high;

    if ((right - left) <= 1)
        return;

    pivot = rand() % (high - low + 1);
    pivot_item = a[pivot];

    while (left < right) {
        while (a[left] <= pivot_item)
            left++;

        while (a[right] > pivot_item)
            right--;

        swap(a,left,right);
    }

    partition(a, low, right-1);
    partition(a, right+1, high);

    return;
}

int main() {
    int a[] = {24, 5, 3, 35, 14, 23, 19, 43, 2, 1};
    int i, n = 10;

    printf("\nUnsorted elements: \n");
    printarray(a,n);
    quicksort(a,0,n-1);
    printf("\nSorted elements: \n");
    printarray(a,n);

}


void printarray(int a[], int n) {
    int i;

    for (i = 0; i < n; i++)
        printf(" %d ", a[i]);
    printf("\n");
}

每次我得到不同的输出如下。

:>~/prgms$ ./a.out 

Unsorted elements: 
 24  5  3  35  14  23  19  43  2  1 

Sorted elements: 
 14  2  19  1  5  23  43  35  3  24 

:>~/prgms$ ./a.out 

Unsorted elements: 
 24  5  3  35  14  23  19  43  2  1 

Sorted elements: 
 1  5  35  14  23  19  3  24  43  2 

2 个答案:

答案 0 :(得分:3)

除了stark指出的错误,可以通过更改

来修复
pivot = rand() % (high - low + 1);

pivot = low + rand() % (high - low + 1);

还有两个错误。 首先,

    while( a[left] <= pivot_item )
    left++;

应该是

    while (a[left] < pivot_item) left++;

否则,索引left可能会超出数据透视位置甚至数组的末尾,从而导致未定义的结果。 第二,

if ((right - left) <= 1)
return;

应该是

if (right - left < 1) return;

否则,长度为2的分区未被分类。

答案 1 :(得分:2)

在分区中,枢轴取自范围0 ..(高 - 低+ 1)。它应该从低......范围内取得。