在Java中实现Wikipedia就地快速排序伪代码

时间:2018-04-08 00:30:05

标签: java quicksort in-place

我在https://en.wikipedia.org/wiki/Quicksort上使用名为Lomuto分区方案的伪代码。但我只是不明白我在这里做错了什么。数组永远不会有条理(无论输入大小如何)。这是我期末考试的准备。我的教授希望我们使用这个算法,但我不能只是学习它,除非我通过测试来了解它是如何工作的。

private static void quickSort(Integer A[], int l, int r) {

    if (l < r) {
        int k = partition(A, l, r);
        quickSort(A, l, k - 1);
        quickSort(A, k + 1, r);
    }
}

private static int partition(Integer A[], int l, int r) {
    int pivot = A[r];
    int i = l;

    for (int j = l; j <= r - 1; j++) {
        if (A[j] <= pivot) {
            i++;
            int temp = A[j];
            A[j] = pivot;
            pivot = temp;
        }
    }

    int temp = A[i + 1];
    A[i + 1] = A[r];
    A[r] = temp;

    return i + 1;
}

1 个答案:

答案 0 :(得分:1)

除了你没有正确地转录伪代码之外,我不知道还能说些什么。在partition开始时,i应该等于l - 1,但您将其设置为l

此外,您没有在嵌套循环中使用A[i]交换A[j]。这是正确的实现:

private static int partition(Integer A[], int l, int r) {
    int pivot = A[r];
    int i = l - 1;

    for (int j = l; j <= r - 1; j++) {
        if (A[j] < pivot) {
            i++;
            int temp = A[i];
            A[i] = A[j];
            A[j] = temp;
        }
    }

    int temp = A[i + 1];
    A[i + 1] = A[r];
    A[r] = temp;

    return i + 1;
}