2017-03-16 73 views
0

當我嘗試運行下面的快速排序代碼時,它將無限循環。最後一次迭代將無限循環。Quicksort Java代碼將無限循環

class QuickSort { 
    public static void main(String[] args) { 
     int arr[] = {10, 7, 8, 9, 1, 5,2}; 
     QuickSort ob = new QuickSort(); 
     ob.sort(arr, 0,arr.length-1); 
     for(int s:arr){ 
      System.out.print(" "+s); 
     } 
    } 
    int partition(int[] arr,int l,int h){ 
     int piv = arr[h]; 
     int i=l-1; 
     for(int j=l;j<=h-1;j++){ 
      if(arr[j] <= piv){ 
       i++; 
       int temp = arr[i]; 
       arr[i]=arr[j]; 
       arr[j]=temp; 
      } 
     } 
     int tp = arr[i+1]; 
     arr[i+1]=arr[h]; 
     arr[h]=tp; 
     return i+1; 
    } 

    void sort(int[] arr,int l,int h){ 
     while(l<h){ 
      int p = partition(arr, l, h); 
      sort(arr, l, p-1); 
      sort(arr, p+1, h); 
     } 

    } 
} 

請幫助,哪裏出問題。

+5

使用調試器來了解發生了什麼 – Jens

+3

您是否嘗試過調試代碼? – JonK

+3

你忘了遞歸方法的基礎...退出條件 – AxelH

回答

0

lhsort()永遠不會改變,所以你總是有l < h == true

5

代替while循環,使用if條件,如下。

if(l<h){ 
     int p = partition(arr, l, h); 
     sort(arr, l, p-1); 
     sort(arr, p+1, h); 
    } 

沒有必要在一個無限循環while排序遞歸調用。循環是無限的,因爲lr將永遠不會在算法中改變。

希望你已經在使用的排序方法while這個幫助:)

1

。這導致無限遞歸調用,最終會導致StackOverFlowException。正如評論中所建議的那樣,這些是常見的錯誤,您可以通過調試輕鬆找到它們(或簡單算法的簡單空運行)。

你只需要兩個遞歸調用形成滿足條件(l < h) 對於這種方法sort的每次調用你需要一個if條件與其使用如下while循環。

void sort(int[] arr,int l,int h){ 
    if(l<h){ 
     int p = partition(arr, l, h); 
     sort(arr, l, p-1); 
     sort(arr, p+1, h); 
    } 
}