2017-03-16 13 views
0

私は以下のクイックソートコードを実行しようとすると、その無限ループに行く最後の反復は無限ループに行きます。クイックソート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はalgoでは決して変更されないため、ループは無限大です。

・ホープ、この助け:)

1

あなたは、ソート方法でwhileを使用していました。これにより無限の再帰呼び出しが発生し、最終的にはStackOverFlowExceptionが発生します。コメントで示唆されているように、これは一般的な間違いであり、デバッグ(または簡単なアルゴリズムの単純なドライラン)によって簡単に見つけることができます。あなたは、ちょうど2つの再帰呼び出しが必要

は、あなたが以下のようにwhileループinsteadof if条件を必要条件このため(l < h) を満たす方法sortの各呼び出しを形成します。

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); 
    } 
} 
関連する問題