0

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

这是我的代码

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

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

我不明白为什么,如果我得到任何帮助,我将不胜感激^_^

4

2 回答 2

1

我没有仔细阅读,但在

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

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

于 2013-08-05T15:43:54.747 回答
1

这个程序有很多错误,以下是我发现的一些:

  1. 你不使用starPosquickSort()
  2. 你不使用length(你使用A.length)在quickSort()
  3. 查尔斯提到的枢轴“叠加”问题
  4. partition()您应该将right位于枢轴且较小的项目的位置left与位于枢轴且较大的项目交换位置-您不要这样做。

可能还有更多。您可以看到我在 Ruby 中为快速排序所做的实现(很容易将其迁移到 Java)并与您的实现进行比较,直到您正确为止——这比大多数人想象的要棘手!

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

于 2013-08-05T15:47:22.213 回答