下面是選擇排名算法的實現,該算法用於查找數組中第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)
我想,也許蘭特()是導致此問題,但我我不確定。我也不知道如何解決它。
沒有,很可能'等級('這就是問題 – hexafraction
可能你的遞歸永遠不會結束 – Kostia
@Kostia你的意思是絕對的,你可以舉一個例子,說明它失敗了,這將使修復更容易,而不是找到我們自己的例子 – aaronman