【问题标题】:Quick sort in C++. Almost correct but the outcome shiftedC++ 中的快速排序。几乎正确,但结果发生了变化
【发布时间】: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


【解决方案1】:

第 27 行:应该是 qsort(a, 0, n-1);

【讨论】:

  • 添加解释,答案可能会变得有用。
猜你喜欢
  • 1970-01-01
  • 2017-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-31
  • 1970-01-01
  • 2021-03-04
  • 1970-01-01
相关资源
最近更新 更多