首页 > 电脑

我这个快速排序算法哪里有问题...?

更新时间2019-06-20 12:42:52

搜索了一下,说是栈溢出,但我看着完全没问题?希望大佬指出问题根源并成功修改,感激不尽.


#include "pch.h"

#include <iostream>

#include <stdlib.h>

using namespace std;

void fast(int wait[], int begin, int end) {

int i = begin, j = end, k = wait[0];

if (end - begin > 0) {

while (i < j) {

for (; i < j; --j) {

if (wait[j] < k) {

swap(wait[i], wait[j]);

++i;

break;

}

}

for (; i < j; ++i) {

if (wait[i] > k) {

swap(wait[i], wait[j]);

--j;

break;

}

}

}

fast(wait, begin, i-1);

fast(wait, j, end);

}

return;

}

int main(void)

{

int wait[10] = { 0,2,6,3,8,1,51,98,62,100 };

fast(wait, 0, 9);

for (int i = 0; i < 10; ++i)cout << wait[i] << ' ';

system("pause");

return 0;

}


完全没看懂你的算法,qsort作为经典的算法,基本在任何教程上都可以找到完整的源码,网上也有很多改进过的,但一般都由二个函数组成,排序和分区,你把它们合而为一,但程序的确有问题,我单步了下,先不说效率(你的循环明显多了),你的第一个循环结束,i和j都为0,第二个循环不可能被执行,直接进入第一个递归,参数为  fast(wait, 0, -1); 因为begin<end,直接退出,执行第二个递归,参数为 fast(wait, 0, 9); //因为j=0,end没有变,你会发现与你原始调用一样的,也就是递归死循环了,结果当然是栈溢出

建议使用标准的qsort

参考

int part(int *r,int i, int j)
{
   int flag = r[i];
   while(i < j)
   {
       while(i < j && r[j] >= flag)  j--;
       if(i < j) r[i++] = r[j];
       while(i < j && r[i] <= flag)  i++;
       if(i < j) r[j--] = r[i];
   }
   r[i] = flag;
   return i;
}
void fast(int *wait,int low, int high)
{
   int f;
   if(low < high)
   {
       f = part(wait,low, high);
       fast(wait,low, f - 1);
       fast(wait,f + 1, high);
   }
}

你起码说一下你的思路吧

上一篇:想装一个像网吧电脑一样的系统叫什么

下一篇:快应用已经上线了,快应用想跟小程序竞争真的可以吗?