簡體   English   中英

Java中的堆棧溢出錯誤

[英]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適當調整RightLeft大小即可。 現在,對於每A大於或等於400的A ,您的程序都會失敗。

一定

if(k-1 == q)
   {

永遠不會是真的,因為

if(k > q)
   {

屏蔽它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM