2013-08-05 185 views
0

我還是一個初學者,我試圖寫一個快速排序的代碼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]+" "); 
     } 
    } 
} 

我得到一個堆棧過流異常的遞歸調用

我不明白爲什麼我會感謝所有幫助我得到的^ _^

+1

我建議你找到最簡單的情況下發生這種情況,並使用您調試器來單步執行代碼,看看它在做什麼以及爲什麼。 –

回答

1

有這個計劃中有許多錯誤,這裏有幾個,我發現:

  1. 你不「T使用starPosquickSort()
  2. 你不quickSort()
  3. 樞軸使用length(您使用A.length) 「覆蓋」 的問題查爾斯提到
  4. partition()您應該將物品right的位置切換到數據透視表,並將其中的一個數字爲left的商品的位置切換到數據透視表並且更大 - 您不這樣做。

並且可能還有更多。 你可以看到我在Ruby中做快速排序的一個實現(很容易將它移植到Java),並與你的實現進行比較,直到你做對了 - 它比大多數人認爲的更棘手!

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

1

我沒仔細看過,但在

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

你肯定在數元素A [透視]在您的遞歸方法的兩個分支