簡體   English   中英

給出堆棧溢出錯誤的簡單快速排序算法?

[英]Simple QuickSort Algorithm giving Stack Overflow Error?

我的朋友有一個小問題,我的知識快要結束了。 他寫了一個簡單的(他在學校得到的)快速排序算法,它產生了一個 StackOverflow 錯誤。 我知道這意味着它在某處多次調用自己遞歸,但我無法得到邏輯錯誤 - 請幫助我!

這是代碼(我省略了一些代碼,因為它只是為了在 2 個文本區域中顯示它):

int array [] = new int [10];
...
 public static void quicksort (int array[],int l,int r){
int i = l;
int j = r;
int mitte = array [(l+r)/2];

while (i<j) {
  while  (array[i]<mitte) {
    i++;
  } // end of if
  while  (mitte<array[i]) {
    j--;
  } // end of if
  if (i<=j) {
    int merke =array[i];
    array[i] = array [j];
    array [j] = merke ;
    i++;
    j--;
  } // end of if
  if (i<j) {
    quicksort(array,l,j);
  } // end of if
  if (l<r) {
    quicksort(array,l,r);
  } // end of if
} // end of while
}

它是這樣調用的:

 quicksort(array,0,9);

但是,如果我們調用它並且兩個數字相同,則不會產生溢出。

如果需要更多代碼,這里是 pastebin 上的完整代碼: http : //pastebin.com/cwvbwXEu

這個電話:

if (l<r) {
  quicksort(array,l,r);
}

使用傳入的相同參數遞歸調用quicksort ,而不是調用較小的子問題來解決。 因此它將無限遞歸。

if (l<r) 
quicksort(array,l,r);

l 不是總是小於 r 嗎? 這將導致無限遞歸,這就是為什么如果兩個值相同則不會溢出的原因。

首先,這里有一個無限循環:

while  (mitte<array[i]) {
    j--;
  } // end of if

它需要是array[j]

其次(並導致無限遞歸),在對快速排序的第二次調用中

if (l<r) {
  quicksort(array,l,r);
} // end of if

在遞歸中,你總是需要縮短你調用自己的范圍,否則它將是無限的。 我還沒有弄清楚你在做什么,但我認為你的意思是:

if (i<r) {
   quicksort(array,i,r);
 } // end of if

暫無
暫無

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

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