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私はこのエラーを解決することができますか?
これはすべてのrecusriveアルゴリズムに固有の問題です。最終的にスタックメモリがなくなります。 Javaの部分的な修正は[こちら](https://stackoverflow.com/questions/3700459/how-to-increase-the-java-stack-size)ですが、入力サイズが十分大きければ、いつでも'StackOverflowException'を生成します。 – Turing85
あなたは再帰関数を使用しています。入力を毎回半分に分割しています。 '50,000 '要素では、' log_2(50000)〜= 16'の最善のスタック深さを見ています。最悪の場合、スタック深さは「50000」である。これは、スタックオーバーフローに対して非常に脆弱です。 – hnefatl
[Javaスタックサイズを増やすにはどうすればいいですか?](https://stackoverflow.com/questions/3700459/how-to-increase-the-java-stack-size) – Turing85