簡體   English   中英

quicksort實現錯誤java

[英]quicksort implementation bug java

我在以下我的快速排序實現中做錯了什么:

public static void quicksort(int[] array, int start, int end) {
    while (start < end) {
        int pIndex = partition(array, start, end);
        quicksort(array, start, pIndex - 1);
        quicksort(array, pIndex + 1, end);
    }
}

public static int partition(int[] array, int start, int end) {
    int pivot = array[end];
    int pIndex = start;
    for (int i = start; i <= end - 1; i++) {
        if (array[i] <= pivot) {
            int tmp = array[pIndex];  // swap values
            array[pIndex] = array[i];
            array[i] = tmp;
            pIndex++;
        }
    }
    int tmpVal = array[pIndex];
    array[pIndex] = pivot;
    array[end] = tmpVal;
    return pIndex;
}

當針對數組{7,5,3,6,8,1,1,2,4}的測試用例運行它時,它會將數組重新排列為{1,2,3,4,8,5,7,6}在其中它對數組的左側進行排序,但是隨后進入{1,2}數組似乎是一個無限循環,並且永遠不會離開該遞歸調用。 我嘗試添加一個基本情況,如果array.length小於2,則返回;否則,返回0。 但這沒什么區別。

這是我的代碼的鏈接。

有人知道怎么了嗎?

你的循環

for (int i = 0; i <= end - 1; i++) {

partition區內應該是

for (int i = start; i <= end - 1; i++) {

否則,您的pIndex可能會超出范圍的startend ,因此您對quicksort的回溯調用將具有相同的參數。

編輯

您的ideone代碼的另一個問題(上面未顯示)是

if (array.length < 2) { return; }

quicksort您不會更改數組的長度,因此array.length始終為8。

第三個問題,導致無限循環的是

while (start < end) {

quicksort您不會在此循環中更改start或end的值,因此該循環永遠不會退出。 有關工作示例,請參見https://ideone.com/wY23C6

while (start < end) {
    int pIndex = partition(array, start, end);
    quicksort(array, start, pIndex - 1);
    quicksort(array, pIndex + 1, end);
}

應該

if (start < end) {
    int pIndex = partition(array, start, end);
    quicksort(array, start, pIndex - 1);
    quicksort(array, pIndex + 1, end);
}

暫無
暫無

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

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