Algorithm 什么';我的快速排序只有两位数有问题;你的立场错了吗?

Algorithm 什么';我的快速排序只有两位数有问题;你的立场错了吗?,algorithm,sorting,structure,Algorithm,Sorting,Structure,我的快速分拣代码如下: template<typename T> void quick_sort_recursive(T arr[], int start, int end) { if (start >= end) return; T pivot = arr[start]; int left = start + 1, right = end; while (left < right) { while (arr[ri

我的快速分拣代码如下:

template<typename T>
void quick_sort_recursive(T arr[], int start, int end) {
   if (start >= end) return;
   T pivot = arr[start];
   int left = start + 1, right = end;

   while (left < right) {        
        while (arr[right] >= pivot && left < right) right--;
        while (arr[left] < pivot && left < right) left++;
        std::swap(arr[left], arr[right]);
    }

    if (arr[right] <  arr[start])
        std::swap(arr[left], arr[start]);
    else
        right--;

    quick_sort_recursive(arr, start + 1, right - 1);
    quick_sort_recursive(arr, right + 1, end);
}

template<typename T>
void quick_sort(T arr[], int len) {
    quick_sort_recursive(arr, 0, len - 1);
}
但是,奇怪的事情发生了。我得到一个输出:

1
1
2
3
5
5
5
6
24
7
32
35
43
54
353
632
5435
那么,为什么7和24总是错误的,而其他的却是正确的呢?

您的递归调用

quick_sort_recursive(arr, start + 1, right - 1);
quick_sort_recursive(arr, right + 1, end);

从数组中省略两个元素。位于起始位置的图元和位于右侧位置的图元。似乎您希望将pivot元素交换到两个段之间的中间位置,因此您应该使用
start
开始第一个递归,而不是
start+1

调试它时看到了什么?首先,我使用最后一个元素作为pivot,代码可以正确运行。但是,当我尝试更改为第一个元素时,我进入了无限循环,然后我左右跟踪,最后,还有一个bug,你可以看到,非常感谢。过去有很多错误。我发现还有一个错误。3Q.可能需要测试更多模式,以查看是否存在任何其他问题。代码类似于霍尔分区方案,其中快速排序调用是快速排序(arr、start、pivot);快速排序(枢轴+1,高)。“end”指向数组的末尾还是最后一个元素?如果它指向最后一个元素,那么名称low和high将更有意义。
quick_sort_recursive(arr, start + 1, right - 1);
quick_sort_recursive(arr, right + 1, end);