【问题标题】:Recursive QuickSort in java not workingjava中的递归快速排序不起作用
【发布时间】:2017-04-09 03:46:56
【问题描述】:

我正在尝试在 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");
}

【问题讨论】:

    标签: java algorithm recursion quicksort partition


    【解决方案1】:

    看起来您的分区算法看起来是基于Wikipedia 中的 Lomuto 分区方案。但是,在 Wikipedia 中,伪代码为 for j := lo to hi - 1,它基于 Pascal 语法。在类似 Pascal 的语言中,这意味着 j 的最后一个值是 hi - 1。在 Java 等类 C 语言中,我们通常将值的上限设置为 after 索引将具有的最后一个值,而不是最后一个值。这意味着在您的代码中,j 永远不会真正具有值hi - 1。修复 for 循环以确保 j 确实采用值 r-1 使事情正常进行,以您的示例为例。

    【讨论】:

    • 非常感谢,for 循环的迭代次数少于应有的次数,而且它在某些情况下能正常工作真是太幸运了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-14
    • 2022-12-16
    • 2013-10-08
    • 1970-01-01
    • 2020-04-18
    • 2016-03-19
    • 1970-01-01
    相关资源
    最近更新 更多