快速排序分区错误

时间:2015-02-15 12:07:17

标签: c++ sorting quicksort partitioning

int partition(int A[], int low, int high){
    int mid = (low+high)/2;
    int pivot = A[mid];
    while(low < high) {
        while(low <= high && A[high] >= pivot)
            high--;
        while (low <= high && A[low] <= pivot)
            low ++;
        if(low < high){
            int tmp = A[low];
            A[low] = A[high]; 
            A[high] = tmp;
            high--;
            low++;
        }
    }
    return mid;
}

这是我的快速排序分区函数,它假设交换数组的索引,以便枢轴左侧的所有内容都较低,而右侧的值较高。然后它返回轴心点。

我的问题是这个函数有什么问题,它编译得很好,但我找不到逻辑错误。

void quickSort(int A[], int low, int high) {

if (low >= high){
  return;
}
int ppos = partition(A, low, high);//does the swaping and returns the pivot
quickSort(A, low, ppos-1);
quickSort(A, ppos+1, high);
}

这是我如何回忆起这个功能,无法判断分区中的错误还是回想起分区。

2 个答案:

答案 0 :(得分:1)

您返回枢轴的中间位置,但在分区后,它可能已被移动到其他位置。

通常的解决方法是将枢轴移到前面,进行分区并最终将枢轴放到正确的位置。

答案 1 :(得分:0)

以@ CommuSoft为例

  

20 6 15 3 8

在第一步中,208将被交换,提供

  

8 6 15 3 20

low=1high=3

在下一步中,high停留在3low也会升至3。由于low == high不会交换任何内容,因此您的值会低于上限范围内的pivot

修复此比较

while (low <= high && A[high] > pivot)
    high--;

while (low <= high && A[low] < pivot)
    low++;

这样也可以移动枢轴并避免半分区范围。

留下最后一个问题,返回mid作为分区点。由于枢轴值也可能会移动,因此必须返回实际分区点,即low

return low;