[英]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.