[英]Quicksort Algorithm throws StackOverflowException
對於家庭作業,我必須編寫一個QuickSort算法的實現,並使用該算法以某種隨機順序對具有100k數字的列表進行排序。
在作業的第一部分中,我必須使用數組的第一項作為樞軸元素。 實際上,這將返回一個排序列表。 但是,對於作業的第二部分,我必須使用最后一項作為樞軸,這會導致StackOverflowException。 當我嘗試在8個記錄的較小集合中嘗試時,它確實可以正常工作。 我一直在看我的代碼,但我不知道自己在哪里出錯。 任何幫助將不勝感激。 我的代碼如下:
public class QuickSort {
private QuickSortStrategyEnum quickSortStrategy;
public QuickSort(QuickSortStrategyEnum quickSortStrategy) {
this.quickSortStrategy = quickSortStrategy;
}
public List<Integer> sortIntegerArray(List<Integer> arrayList, int left, int right) {
if ( left >= right ) {
return arrayList;
}
int i = partition(arrayList, left, right);
if (i <= right) {
int pivotNew = partition(arrayList, i, right);
int pivotIndex = arrayList.indexOf(pivotNew);
arrayList = sortIntegerArray(arrayList, left , pivotIndex - 1);
arrayList = sortIntegerArray(arrayList, pivotIndex + 1, right);
}
return arrayList;
}
private int partition(List<Integer> arrayList, int left, int right) {
int pivot = getPivot(arrayList, left, right);
int i = left + 1;
for (int j = i; j <= right; j++) {
if (arrayList.get(j) < pivot) {
Collections.swap(arrayList, j, i);
i++;
}
}
Collections.swap(arrayList, left, i - 1);
return i;
}
private int getPivot(List<Integer> arrayList, int left, int right) {
int pivot = 0;
switch (quickSortStrategy) {
case FIRST:
pivot = arrayList.get(left);
break;
case LAST:
pivot = arrayList.get(right);
break;
}
return pivot;
}
}
提示:如果right == left + 1
會發生什么?
這兩行看起來很混亂:
int pivotNew = partition(arrayList, i, right);
int pivotIndex = arrayList.indexOf(pivotNew);
查看返回的partition
,並將其與使用其結果的方式進行比較。
除了David Harkness指出的事實之外,分區邏輯也存在問題。 嘗試一下:(刪除David Harkness指出的內容之后)
private int partition(List<Integer> arrayList, int left, int right) {
int pivot = getPivot(arrayList, left, right);
int i = left - 1;
for (int j = left; j < right; j++) {
if (arrayList.get(j) <= pivot) {
i++;
Collections.swap(arrayList, j, i);
}
}
Collections.swap(arrayList, i+1, right);
return i+1;
}
適用於樞軸是最后一個元素的情況。 不適用於第一個元素。
閱讀,理解紙上的工作,干點事,編寫偽代碼,然后向Eclipse打招呼。 不要着急執行事情。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.