所以我一直在努力实现一个快速排序,但它会产生一个stackoverflower错误,但我似乎无法找到原因。
有人可以帮助我吗?
public static int partition(int[] a, int p, int q){
int i = 0;
for (int j = p; j < q; ++j){
if(a[j] <= a[q]){
int tmp = a[j];
a[j] = a[i];
a[i] = tmp;
i++;
}
}
int tmp = a[i];
a[i] = a[q];
a[q] = tmp;
return i;
}
public static void qsort(int[] a, int p, int q){
if(p < q){
int x = partition(a, p, q);
qsort(a, p, x - 1);
qsort(a, x + 1, q);
}
}
public static void main(String args[]){
int[] a = {4, 6, 2, 9, 8, 23, 0, 7};
qsort(a, 0, a.length - 1);
for(int i : a){
System.out.print(i + " ");
}
}
答案 0 :(得分:2)
堆栈溢出错误意味着永远不会达到递归的停止条件,在这种情况下p < q
永远不会成立。使用调试器,为该行设置断点,并查找使用相同参数重复递归调用qsort()
的时间。
答案 1 :(得分:2)
有几个错误,但您遇到的一个错误是partition()
,i
不限制在p
和q
之间。您很快就会遇到p=2
,q=3
而i
的最终值为1
的情况。这导致无限递归,因为qsort()
一直用相同的参数调用自己。