java的快速排序堆栈溢出
问题描述:
我还是一个初学者,我试图写一个快速排序的代码java的快速排序堆栈溢出
这里是我的代码
package algo_quicksort;
public class Algo_quicksort {
public static int partition(int[]A,int p,int r){
int x=A[p];
int i=p+1;
int temp;
for(int j=p+1;j<r;j++){
if(A[j]<x){//if A[j] is bigger than the pivot do nothing
temp=A[j];
A[j]=A[i];
A[i]=temp;
i++;
}
}
temp=A[p];
A[p]=A[i-1];
A[i-1]=temp;
return i-1;
}
public static void quickSort(int[]A,int starPos,int length){
if(length==1){
return;
}
else{
if(startPos<length){
int pivot= partition(A,0,length);
quickSort(A,startPos,pivot+1);
quickSort(A, pivot+2,length);
}
}}
public static void main(String[] args) {
int a[]={6,5,4,3,2,1};
System.out.println("A[] after quicksort is: ");
quickSort(a,0, a.length);
for(int i=0;i<a.length;i++){
System.out.print(a[i]+" ");
}
}
}
我得到一个堆栈过流异常的递归调用
我不明白为什么我会感谢所有帮助我得到的^ _^
答
有这个计划中有许多错误,这里有几个,我发现:
- 你不“T使用
starPos
在quickSort()
- 你不
quickSort()
- 枢轴使用
length
(您使用A.length
) “覆盖” 的问题查尔斯提到 - 在
partition()
您应该将物品right
的位置切换到数据透视表,并将其中的一个数字为left
的商品的位置切换到数据透视表并且更大 - 您不这样做。
并且可能还有更多。 你可以看到我在Ruby中做快速排序的一个实现(很容易将它移植到Java),并与你的实现进行比较,直到你做对了 - 它比大多数人认为的更棘手!
答
我没仔细看过,但在
quickSort(A,0,pivot+1);
quickSort(A, pivot,A.length-pivot);
你肯定在数元素A [透视]在您的递归方法的两个分支
我建议你找到最简单的情况下发生这种情况,并使用您调试器来单步执行代码,看看它在做什么以及为什么。 –