[英]Stack Overflow Error in Java
我正在嘗試編寫一個程序,該程序使用遞歸和分區之類的快速排序來找到第k個最小的元素,從而不必對整個數組進行排序。 我覺得我的代碼應該可以工作,但是調用該函數后,我立即收到堆棧溢出錯誤,因此無法對其進行測試。
我以為堆棧溢出與執行堆棧溢出有關,並且我知道它是通過遞歸發生的,但是該錯誤在函數的第一行被調用,這讓我感到困惑。 如果有人可以看一下並提出一些建議,我將不勝感激。 謝謝。
public static int find_kth_smallest( int[] A, int n, int k )
{
int[] Left = new int[200];
int[] Right = new int[200];
int half = n/2;
int x = 0; int j = half + 1; int q = 0;
int count = 0;
int pivot = A[half];
for(int i = 0; i < n; i++)
{
if(A[i] < pivot)
{
Left[x] = A[i];
x++;
}
if(A[i] > pivot)
{
Right[j] = A[i];
j++;
}
}
while(Left[q] != 0)
q++;
if(k < q)
{
return find_kth_smallest(Left, q, k);
}
if(k > q)
{
return find_kth_smallest(Right, n-q, k);
}
if(k-1 == q)
{
return A[pivot];
}
return -1;
您的錯誤是j
應該從0
開始,而不是half+1
。 當前,您正在將數組中樞軸上方的部分復制到Right
的上半部分。 如果您遵循遞歸的右側,那么可以確保在該點之后,樞軸將永遠保持等於0
,因此您將永遠不會停止遞歸。
另外,這里還有其他一些問題:
A
任何元素都不等於0
,這是一個危險的假設。 int[200]
。 這是Java; 您可以在運行時分配這些東西。 只需根據n
適當調整Right
和Left
大小即可。 現在,對於每A
大於或等於400的A
,您的程序都會失敗。 一定
if(k-1 == q)
{
永遠不會是真的,因為
if(k > q)
{
屏蔽它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.