我的快速排序有什么问题 - 只有两位数字'位置错了?

时间:2015-12-22 22:16:15

标签: 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[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);
}

测试数组是:

int a[17] = {3,5,1,5,1,6,7,32,43,2,54,632,24,353,5,5435,35};
但是,发生了一些奇怪的事情。我得到了一个输出:

1
1
2
3
5
5
5
6
24
7
32
35
43
54
353
632
5435

那么,为什么7和24总是错的,但其他人是正确的?

1 个答案:

答案 0 :(得分:0)

您的递归电话

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

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