[英]Stackoverflow error in my quicksort algorithm
由於在遞歸過程中出現堆棧溢出錯誤,我一直在研究這段代碼幾天沒有運氣。
問題表明我們的pivot始終是第0個元素,通過遞歸,我們可以通過交換或創建新數組並將它們復制到原始數組中來對數組進行排序。 我選擇創建2個數組,因為我更容易理解,但是一旦我到達遞歸步驟,我就會得到這個錯誤。
我追蹤算法,並意識到樞軸元素總是放在較低的數組中,可能是問題所在。
enter code here
public static void main(String[] args) {
int[] arr = new int[] { 12, 7, 5, 8, 4, 6, 11, 15 };
quicksort(arr);
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
System.out.println();
}
private static int[] quicksort(int[] arr, int middle) {
// Base case
if (arr.length == 1) {
return arr;
}
int[] upper = new int[arr.length];
int[] lower = new int[arr.length];
int upperIndex = 0, lowerIndex = 0;
// Put the elements into their respective pivots
for (int i = 0; i < arr.length; i++) {
if (arr[i] <= middle) {
lower[lowerIndex++] = arr[i];
} else {
upper[upperIndex++] = arr[i];
}
}
// Recurse, and sort the pivots
lower = quicksort(lower, lower[0]);
upper = quicksort(upper, upper[0]);
// Combine lower, middle, and upper back into one array
System.arraycopy(lower, 0, arr, 0, lowerIndex);
arr[lowerIndex + 1] = middle;
System.arraycopy(upper, 0, arr, lowerIndex + 2, upperIndex);
return arr;
}
結果應該是按升序排序的數組。
您的upper
和lower
數組似乎根本沒有縮小,因此arr.length == 1
永遠不會成立。 更容易實現是使用索引而只使用原始數組。
正如Quimby的回答中所提到的,低位和高位都設置為arr.length的大小。 代碼需要使用指示實際長度的第三個參數,例如
quicksort(lower, lower[0], lowerIndex);
quicksort(upper, upper[0], upperIndex);
如果數據已經排序,則中間將結束,而不是在每個遞歸級別,所有數據最終都在較低的位置,上層為零元素,導致無限遞歸,只能通過堆棧溢出來停止。
由於您正在為快速排序使用單獨的陣列,因此您可能需要考慮3路分區:
public static void quicksort(int[] arr, int pivot, int size) {
// Base case
if (size < 2) {
return;
}
int[] upper = new int[size];
int[] middle = new int[size];
int[] lower = new int[size];
int upperIndex = 0, middleIndex = 0, lowerIndex = 0;
// Put the elements into their respective arrays
for (int i = 0; i < size; i++) {
if (arr[i] < pivot) {
lower[lowerIndex++] = arr[i];
} else if (arr[i] == pivot){
middle[middleIndex++] = arr[i];
} else {
upper[upperIndex++] = arr[i];
}
}
// sort lower and upper
quicksort(lower, lower[0], lowerIndex);
quicksort(upper, upper[0], upperIndex);
// Combine lower, middle, and upper back into one array
System.arraycopy(lower, 0, arr, 0, lowerIndex);
System.arraycopy(middle, 0, arr, lowerIndex, middleIndex);
System.arraycopy(upper, 0, arr, lowerIndex+middleIndex, upperIndex);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.