快速排序的partition函数中判断条件为什么不能用low!=high进行循环,输出时cmd卡住

#include<iostream>
#include<ctime>
#include<cstdlib>
using namespace std;

}
int main()
{
    int num[11];
    srand(time(0));
    for(int i=1;i<=10;i++)
        num[i]=rand()%100+1;
    for(int i=1;i<=5;i++)
        cout<<" "<<num[i];
    int low=1,high=5;
    num[0]=num[1];
//问什么不能用low!=high做判断条件
    while(low!=high)
    {
        while(low!=high&&num[high]>=num[0])
            high--;
        num[low]=num[high];
        if(low==high)
        while(low!=high&&num[low]<=num[0])
            low++;
        num[high]=num[low];
    }
    num[low]=num[0];
    cout<<endl<<num[0]<<endl;
    for(int i=1;i<=10;i++)
        cout<<" "<<num[i];
    return 0;
}
阅读 2.7k
2 个回答
#include<iostream>
#include<ctime>

using namespace std;

int partition(int a[], int low, int high)
{
  int key = a[low];
  while (low != high)
  {
    while (low != high && a[high] >= key) high--;
    a[low] = a[high];
    //if(low==high) 问题所在!
    while (low != high && a[low] <= key) low++;
    a[high] = a[low];
  }
  a[low] = key;
  return low;
}

void qs(int a[], int low, int high)
{
  if (low < high)
  {
    int mid = partition(a, low, high);
    qs(a, low, mid - 1);
    qs(a, mid + 1, high);
  }
}

int main()
{
  int num[11];
  srand(time(NULL));
  for (int i = 1; i <= 10; i++)
    num[i] = rand() % 100 + 1;
  for (int i = 1; i <= 10; i++)
    cout << " " << num[i];
  cout << endl;
  qs(num, 1, 10);
  for (int i = 1; i <= 10; i++)
    cout << " " << num[i];
  return 0;
}

帮你修改了一下,封装成了partition函数,顺手补全了整个快排算法╰( ̄▽ ̄)╭

先回答你的问题,当然是可以用low != high这样的判断,但是不推荐,如果一开始传入的参数比如(10, 1),虽然满足条件,但明显会死循环,最好写成low<=high这样语义性很强的表达式

代码出问题的地方我标了出来,你想想嘛:

  1. 外层while要求low!=high
  2. while内部要求low==high
  3. 2的要求导致low得不到更新,low永远不可能与high相等,这就造成了死循环

你先不用5个数,我给你个测试数据:[2,1,3]
你自己在纸上跟着程序单步跑一跑你就明白你问题出来在哪了。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题