簡體   English   中英

Java中的遞歸QuickSort不起作用

[英]Recursive QuickSort in java not working

我試圖在Java中實現快速排序,它以數組的最后一個元素為支點。 但是,即使在紙上應該看起來也沒有用。

這是輸出:

before sort: 5 2 3 1 4 

after sort: 3 2 4 5 1 

預期的輸出將是1,2,3,4,5,但這似乎沒有發生。

public static void main(String[] args) {
    int A[] = {5,2,3,1,0};
    ArrayUtils.printArray("before sort", A);
    quick_sort(A, 0, A.length-1);
    ArrayUtils.printArray("after sort", A);
}

public static void quick_sort(int[] A, int p, int r) {
    if (p < r) {
        int q = partition(A, p, r);
        quick_sort(A, p, q-1);
        quick_sort(A, q+1, r);
    }
}

我已經跟蹤問題出在調試器的分區中,但是我似乎找不到它在哪里。 似乎for循環有時會產生一個錯誤的i,但有時它會正常工作。.我不確定,這就是我要問的原因。

public static int partition(int A[], int p, int r) {
    int x = A[r];
    int i = p-1;
    for(int j = p; j < r-1; j++) {
        if (A[j] <= x) {
            i = i + 1;
            int temp = A[j];
            A[j] = A[i];
            A[i] = temp;
        }
    }
    int temp = A[r];
    A[r] = A[i + 1];
    A[i + 1] = temp;
    return i + 1;
}

在哪里printArray()是

public static void printArray(String name, int[] array) {
    if (array.length >= 10) {
        System.out.print(name + ": \n");
    } else {
        System.out.print(name + ": ");
    }

    for(int i = 0; i < array.length; i++) {
        if (i % 10 == 0 && i > 0) {
            System.out.print("\n");
        }
        System.out.print(array[i] + " ");

    }
    System.out.println("\n");
}

看起來您的分區算法看起來是基於Wikipedia中的Lomuto分區方案。 但是,在Wikipedia中,偽代碼for j := lo to hi - 1表示for j := lo to hi - 1 ,這是基於Pascal語法的。 在類似Pascal的語言中,這意味着j的最后一個值為hi - 1 在Java之類的類似C的語言中,我們通常使上限值成為索引將具有的最后一個值之后的值,而不是最后一個值。 這意味着在您的代碼中, j實際上不會具有值hi - 1 修復for循環以確保j確實取值r-1可以使您的示例正常工作。

暫無
暫無

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

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