簡體   English   中英

快速排序算法引發StackOverflowException

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

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