2017-12-24 16 views
0

おはよう!クイックソートアルゴリズムを実行するときにStackOverflowErrorが表示されます。 配列内の要素は> 50 000多くの要素を含むQuickSortが原因でStackOverflowErrorが発生する

私のコードは、以下の場合に、このエラーが発生します。

public void recQuickSort(int left, int right) 
{ 
    if(right-left <= 0) 
     return; 
    else { 
     long pivot = a[right]; 
     int partition = partitionIt(left, right, pivot); 
     recQuickSort(left, partition-1); 
     recQuickSort(partition+1, right); 
    } 
} 
public int partitionIt(int left, int right, long pivot) { 
    int leftPtr = left - 1; 
    int rightPtr = right; 
    while (true) { 
     while (a[++leftPtr] < pivot) ; 
     while (rightPtr > 0 && a[--rightPtr] > pivot) ; 
     if (leftPtr >= rightPtr) 
      break; 
     else 
      swap1(leftPtr, rightPtr); 
    } 
     swap1(leftPtr, right); 
     return leftPtr; 
} 

public void swap1(int dex1, int dex2) // Permutation of two elements 
{ 
    long temp; 
    temp = a[dex1]; 
    a[dex1] = a[dex2]; 
    a[dex2] = temp; 
} 

ときの要素> 50 000私はこのエラーを解決することができますか?

+1

これはすべてのrecusriveアルゴリズムに固有の問題です。最終的にスタックメモリがなくなります。 Javaの部分的な修正は[こちら](https://stackoverflow.com/questions/3700459/how-to-increase-the-java-stack-size)ですが、入力サイズが十分大きければ、いつでも'StackOverflowException'を生成します。 – Turing85

+1

あなたは再帰関数を使用しています。入力を毎回半分に分割しています。 '50,000 '要素では、' log_2(50000)〜= 16'の最善のスタック深さを見ています。最悪の場合、スタック深さは「50000」である。これは、スタックオーバーフローに対して非常に脆弱です。 – hnefatl

+1

[Javaスタックサイズを増やすにはどうすればいいですか?](https://stackoverflow.com/questions/3700459/how-to-increase-the-java-stack-size) – Turing85

答えて

1

小さいパーティションで再帰し、次に左または右に更新し、大きなパーティションに対してループバックします。これは、スタックオーバーフロー(log2(n)スタックフレームの制限)を防ぎますが、最悪の場合の時間複雑度O(n^2)を防ぎません。

public void recQuickSort(int left, int right) 
{ 
    while(true){ 
     if(right-left <= 0) 
      return; 
     else { 
      long pivot = a[right]; 
      int partition = partitionIt(left, right, pivot); 
      if((partition - left) <= (right - partition)){ 
       recQuickSort(left, partition-1); 
       left = partition+1; 
      } else { 
       recQuickSort(partition+1, right); 
       right = partition-1; 
      } 
     } 
    } 
} 
関連する問題