我这个快速排序算法哪里有问题...?
搜索了一下,说是栈溢出,但我看着完全没问题?希望大佬指出问题根源并成功修改,感激不尽.
#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);
}
}
你起码说一下你的思路吧