2017-03-21 7 views
0

// 私のように、アルゴリズム自体をコーディングするのではなく、他のコードでアルゴリズムを使用するのが目的なら、Arrays.sortDocumentation here)ジョブ! //クイックソートアルゴリズムの実装でスタックオーバーフローエラーを回避するには

私はこのエラーを取得しておいてください。

Exception in thread "main" java.lang.StackOverflowError 
at language.LanguageDetection.sort(LanguageDetection.java:140) 
at language.LanguageDetection.sort(LanguageDetection.java:141) 
at language.LanguageDetection.sort(LanguageDetection.java:141) 

そして、この行:

at language.LanguageDetection.sort(LanguageDetection.java:141) 

は、コンソール出力の残りの部分を塗りつぶします。

私はJavaの初心者です。すべての辞書単語を含むテキストファイルを並べ替えるためにクイックソートアルゴリズムを実装しようとしています。そのため、すぐにすばやく検索できます。

これがこの問題のために、より適切なソートアルゴリズムが存在することになる場合、または移動するための方法であるが、ここでのコードであれば、私は本当に知らない:

public static void sort(String[] unsorted, int startIndex, int endIndex) 
{ 
if(endIndex - startIndex <= 0) return; //Ends the recursion when unsorted array is of size 1 
String temp; 

char pivot = unsorted[endIndex].charAt(0); 

int j = startIndex; 
for(int i = startIndex; i < endIndex; i++) 
{ 
    if(unsorted[i].charAt(0) < pivot) 
    { 
    temp = unsorted[j]; 
    unsorted[j] = unsorted[i]; 
    unsorted[i] = temp; 
    j++; 
    } 
} 
temp = unsorted[j]; 
unsorted[j] = unsorted[endIndex]; 
unsorted[endIndex] = temp; 

sort(unsorted, startIndex, j - 1); 
sort(unsorted, j + 1, endIndex); 

} 

私はしたくありませんすべての訂正版のコード、ちょうどいくつかの答え、私が間違ってコーディングしていること、そしてこれを行う良い方法があるかどうかを確認してください。

ありがとうございます。

+0

あなたとこのソリューションを比較するhttp://www.vogella.com/tutorials/JavaAlgorithmsQuicksort/article.htmlそしてあなたができることを見てください。 –

+0

スタックオーバーフローは常に発生しますか?リストが短い場合は作業します。 10項目。 – weston

+0

リストを他の目的でソートする必要があり、ソートアルゴリズムをコーディングするのが最終目標ではないようですね。したがって、DIYが目標ではない場合は、['Arrays.sort'](https://docs.oracle.com/javase/7/docs/api/java/util/Arrays.html#sort(java.lang。オブジェクト[])))。 – weston

答えて

1

簡単な解決策:

クイックソートは、2個のサブアレイに入力配列を分割し、その後サブアレイをソート。サブアレイを並べ替えるには、最初に小さいサブブロックを並べ替えるためにの再帰を実行し、次にを並べ替えるにはループを並べ替えます。

各再帰呼び出しは、呼び出し側のサイズの半分である<であるため、再帰深度はlog(N)に制限されます。

関連する問題