Java-实现QuickSort

时间:2019-02-21 17:51:13

标签: java algorithm

我正在学习数据结构和算法。所以我尝试实现快速排序算法。

public static void main(String[] args) {
    // TODO Auto-generated method stub

    int[] arr = new int[] { 10, 16, 8, 12, 15, 6, 3, 9, 5 };

    quickSort(0, arr.length - 1, arr);
}

public static void quickSort(int start, int end, int[] arr) {

    if (start < end) {

        int partitionIndex = partition(start, end, arr);
        quickSort(start, partitionIndex - 1, arr);
        quickSort(partitionIndex+1, end, arr); // When passing partitionIndex+1 in the swap method it throws index out of bound exception

        System.out.println(Arrays.toString(arr));
    }   

}

public static int partition(int start, int end, int[] arr) {

    int pivot = arr[end];
    int pIndex = start;

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

        if (arr[i] <= pivot) {
            swap(i, pIndex, arr);
            pIndex++;
        }
    }

    swap(pIndex, end, arr);
    return pIndex;

}

private static void swap(int i, int index, int[] arr) {

    int temp = arr[i];
    arr[i] = arr[index]; // index out of bound exception is thrown
    arr[index] = temp;

}

在进行递归调用quickSort(partitionIndex+1, end, arr);时,在swap方法中它抛出index out of bound exception。因为没有这样的索引来检索/存储值。 谁能帮我解决这个问题?

1 个答案:

答案 0 :(得分:1)

我假设您尝试实施Wikipedia中的 Lomuto分区方案。如果是这种情况,则您的代码中有2个错误,都在for方法的partition循环中出现:

  1. 开始索引:

您的算法每次都从 0 开始。这导致了IndexOutOfBoundsException,因为它交换了最后的pIndex array.length。如果您解决此问题,该异常将消失,但您的排序结果将是[3, 5, 8, 10, 12, 15, 6, 16, 9],显然排序并不理想。

  1. 结束条件:

这里的错误是,由于您的结束条件是i < end - 1,因此每次都丢失了最后一个迭代,将其更改为i < endi <= end - 1,您应该得到一个完美的结果:< / p>

[3, 5, 6, 8, 9, 10, 12, 15, 16]

为完成此操作,请使用固定的partition方法和您的quickSort方法:

public static void quickSort(int start, int end, int[] arr) {
    if (start < end) {
        int partitionIndex = partition(start, end, arr);
        quickSort(start, partitionIndex - 1, arr);
        quickSort(partitionIndex + 1, end, arr);
    }
}

public static int partition(int start, int end, int[] arr) {
    int pivot = arr[end];
    int pIndex = start;
    for (int i = start; i < end; i++) {
        if (arr[i] < pivot) {
            swap(pIndex, i, arr);
            pIndex++;
        }
    }
    swap(pIndex, end, arr);
    return pIndex;
}