以下は、配列内の K 番目に小さい要素の前にある要素を見つけるために使用される選択ランク アルゴリズムの実装です。このプログラムはうまく動作することもありますが、スタック オーバーフロー エラー (コード スニペットの下のエラー) が原因で失敗することもあります。
public static int rand(int left, int right){
return left+(int)(Math.random()*(double)(right-left));
}
public static int rank(int[] array, int left, int right, int rank){
int pivot = rand(left, right);
int leftend = partition(array, left, right, array[pivot]);
int size = leftend - left +1;
if(size == rank+1){
for(int i=0; i<=leftend; i++)
System.out.print(array[i]+" ,");
return 0;
}else if(size > rank)
return rank(array, left, leftend, rank);
else return rank(array, leftend+1, right, rank - size);
}
public static int partition(int[] array, int left, int right, int pivot){
while(true){
while(left <= right && array[left] <= pivot)
left++;
while(right >= left && array[right] > pivot)
right--;
if(left > right)
return left-1;
int temp = array[left];
array[left] = array[right];
array[right] = temp;
}
}
エラー:
Exception in thread "main" java.lang.StackOverflowError
at java.util.Random.nextDouble(Random.java:409)
at java.lang.Math.random(Math.java:712)
at mod.rand(mod.java:12)
at mod.rank(mod.java:16)
at mod.rank(mod.java:25)
おそらく rand() がこの問題を引き起こしていると思いますが、よくわかりません。また、それを修正する方法もわかりません。