我的快速排序代码在这里:
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总是错的,但其他人是正确的?
答案 0 :(得分:0)
您的递归电话
quick_sort_recursive(arr, start + 1, right - 1);
quick_sort_recursive(arr, right + 1, end);
省略数组中的两个元素。位置开始处的元素和位置右侧的元素。您似乎想要将pivot元素交换到两个段之间的中间位置,因此您应该使用start
而不是start + 1
开始第一次递归。