【问题标题】:Quicksort algorithm issue快速排序算法问题
【发布时间】:2017-01-14 12:01:33
【问题描述】:

我的快速排序算法有问题。代码编译没有任何错误,但是当我尝试运行程序时,我得到的唯一输出是“随机数是:”,然后就像它想要用户输入一样,然后我必须终止程序。现在,当我在主程序中删除对快速排序函数的调用时,程序会打印出数字,但不能与快速排序函数的调用一起使用。我不确定我使用的参数是问题还是函数本身。

#include <iostream>
#include <stdlib.h>
#include <iomanip>
#include <stack>
#include <queue>
using namespace std;

void quicksort(int arr[], int left, int right) {
  int l = left;
  int r = right;
  int tmp;
  int pivot = arr[(left + right) / 2];

  while (l <= r) {
    while (arr[l] < pivot)
      l++;
    while (arr[l] > pivot)
      r--;
    if (l <= r) {
      tmp = arr[l];
      arr[l] = arr[r];
      arr[r] = tmp;
      l++;
      r--;
    }
  }

  if (left < r)
    quicksort(arr, left, r);
  if (l < right)
    quicksort(arr, r, right);

}

int main() {
  int n = 20;
  int testlist[n];

 for (int i = 0; i<n; i++) {
   testlist[i] = rand()%100;
 }

 cout << "The random numbers are: " << endl;
 for (int i = 0; i < n; i++) cout << testlist[i] << " ";


 quicksort(testlist, 0, n - 1);

 cout << " " << endl;

 cout << "The sorted numbers are: " << endl;
 for (int i = 0; i < n; i++) {
   cout << testlist[i] << " ";
 }

 return 0;

}

【问题讨论】:

  • 一个建议:普通的l(小写字母L)看起来很像1,这在阅读代码时会令人困惑。

标签: c++ algorithm function sorting quicksort


【解决方案1】:

quicksort 函数中有一个无限循环。由于此函数永远不会返回,因此在“随机数是:”行之后不会打印任何内容,因为 quicksort 调用永远不会返回。随机数本身可能会或可能不会打印(并在我的系统上打印),因为不能保证系统立即将输出缓冲区刷新到屏幕。 (如果您在打印数字的 for 循环之后将 std::endl 写入 cout,它们可能会被打印出来。)

我怀疑这是问题所在:

while (arr[l] > pivot)
    r--;

那个声明while (arr[l] &gt; pivot)实际上应该是while (arr[r] &gt; pivot)

【讨论】:

  • David 抱歉,这是我的错误编辑,删除您的编辑!另外,我怕这不能解决问题,代码会崩溃!
  • 我已删除我的编辑以匹配 OP 的当前/原始代码。至于崩溃,是的,无限循环并不是该函数中唯一的错误。现在是 OP 学习使用调试器并单步调试以查看发生了什么的好时机……或者只是寻找类似的复制粘贴错误,因为它们混淆了变量。 ;-)
  • 谢谢大卫! :) 让我为混乱道歉。 ://
【解决方案2】:

发生这种情况是因为 quicksort() 内部出现问题,而您打印的数字没有std::endl

你看,没有std::endl,数字被写入输出缓冲区,但它们没有被刷新。他们最终会在没有std::endl 的情况下使用,但是您的代码不会到那个时候。

专业提示:调试代码时始终使用std::endl


我不会调试你的quicksort(),因为你应该这样做,以便练习!如果您需要参考,可以随时使用我的宝贝示例:Quicksort (C++),它以类似 的方式编写,以便 的人可以轻松关注! :)


预感:您使用递归,您的程序不会终止...无限循环可能是原因... ;)


顺便说一句,如果我是你并且没有任何重要的理由使用:

#if __INCLUDE_LEVEL__ < 1

我会丢弃它(连同伴随的#endif)。

【讨论】:

  • 我看到了他的错误,这只是一个常规的、普通的无限循环
  • 我非常努力不告诉他的错误,以便他可以练习。幸运的是另一个答案并没有解决问题,我希望他会调试看到你的代码 Mr. Psyduck。 :)
猜你喜欢
  • 2023-01-31
  • 2018-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-24
  • 2018-05-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多