【发布时间】:2019-05-07 16:41:48
【问题描述】:
我在 C++ 中进行了快速排序,但效果不佳。例如,如果我有一个 {5, 3, 4, 6, 7} 数组,则结果将是 {0, 3, 4, 5, 6}。我找不到原因,因为我之前在 Pascal 中使用过相同的方法并且效果很好。
#include <iostream>
using namespace std;
void qsort(int (&ary)[10000], int l, int r){
int i = l, j = r, mid = ary[(l + r) / 2];
while (i <= j){
while (ary[i] < mid) i ++;
while (ary[j] > mid) j --;
if (i <= j){
int temp = ary[i];
ary[i] = ary[j];
ary[j] = temp;
i ++; j --;
}
}
if (i < r) qsort(ary, i, r);
if (l < j) qsort(ary, l, j);
}
int main(){
int n;
int a[10000];
cin >> n;
for (int i = 0; i < n; i ++){
cin >> a[i];
}
qsort(a, 0, n);
for (int i = 0; i < n; i ++){
cout << a[i] << ' ';
}
return 0;
}
【问题讨论】:
-
当您使用调试器运行算法时,一次一行,并观察数组的值和此处使用的所有变量,当它们发生变化时,您做了什么观察?免费线索:运行调试器并输入一个只有一个值的数组,然后将其提供给您的快速排序。惊奇地观察,当你单步执行你的代码时,一次一行,当你的调试器向你展示你的代码是如何把兔子从帽子里拉出来的,并想象你的数组神秘地增长了第二个值!了解如何使用调试器。
-
感谢您的建议!我刚刚学习了调试器,我发现了问题。我应该调用 qsort(a, 0, n - 1) 而不是 qsort(1, 0, n)。
-
用笔和纸手动运行您的算法。你的例子太小了,这应该没问题。
标签: c++ algorithm sorting quicksort