java quicksort堆栈溢出

时间:2013-08-05 15:36:59

标签: java stack-overflow quicksort

我还是初学者,我正在尝试编写快速排序代码

这是我的代码

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]+"  ");
        }
    }
}

我在递归调用中得到了一个堆栈溢出异常

我不明白为什么,我会感激任何帮助我得到^ _ ^

2 个答案:

答案 0 :(得分:1)

我没有仔细阅读,但是

quickSort(A,0,pivot+1);
quickSort(A, pivot,A.length-pivot);

你肯定会在递归方法的两个分支中计算元素A [pivot]

答案 1 :(得分:1)

这个程序中有很多错误,这里有一些我发现的错误:

  1. 您未在starPos
  2. 中使用quickSort()
  3. 您未在length
  4. 中使用A.length(使用quickSort()
  5. 查尔斯提到的枢轴“覆盖”问题
  6. partition()中,您应该将right的项目的位置切换到枢轴,并使用left的项目切换到枢轴并且更大 - 您不要这样做这一点。
  7. 并且可能还有更多。 您可以看到我在Ruby中为quicksort做的实现(很容易将其迁移到Java)并与您的实现进行比较,直到您做对了 - 这比大多数人想象的要复杂!

    http://alfasin.com/playing-with-ruby/

相关问题