当前位置: 首页 > 知识库问答 >
问题:

Java-实现QuickSort[副本]

景成和
2023-03-14

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

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方法中,它会抛出索引越界异常。因为没有这样的索引来检索/存储值。有谁能帮我解决这个问题吗?

共有1个答案

林劲
2023-03-14

我假设您试图实现来自维基百科的Lomuto分区方案。如果是这种情况,您的代码中有2个错误,都在partition方法的for循环中:

  1. 开始索引:

您的算法每次从0开始。这导致了IndexOutOfBoundsException,因为它交换了pindex,后者在末尾是array.lengts。如果您修复了这一点,异常将会消失,但您的排序结果将是[3,5,8,10,12,15,6,16,9],这显然不是完美排序的。

这里的错误是,每次都缺少最后一次迭代,因为您的结束条件是i 将其更改为 i i<=end-1,您将得到一个完美的结果:

<代码>[3,5,6,8,9,10,12,15,16]

下面是固定的partition方法和您的quicksort方法:

java prettyprint-override">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;
}

 类似资料:
  • 问题内容: 为了刷新一些Java,我尝试实现一种可以对整数数组进行排序的quicksort(inplace)算法。以下是到目前为止的代码。您可以通过拨打电话。 如果两个“指针”均指向与支点值相同的数组条目,则该代码显然会失败(陷入无限循环)。枢轴元素始终是当前分区的最右边(索引最大的分区)。 但是我无法弄清楚如何避免这种情况,有人看到解决方案了吗? 问题答案: 这应该可以工作( 稍后将检查正确性

  • ...我正在尝试写一个我能写的最简单/优雅的解决方案(更喜欢不创建新的数组/列表,旋转多个元素等),下面是我的... ...我的提交失败了,因为我的第一个分区不是而是,所以在以后的分区中,我的第一次合并是而不是,因为我的算法没有保持左分区元素的顺序(即)。 我的算法从结束到开始迭代,不包括起始元素(枢轴)... ->数据透视为5,数据透视索引为7(超出界限) ->2不大于5,跳过 ->9大于5,透

  • 本文向大家介绍Javascript实现快速排序(Quicksort)的算法详解,包括了Javascript实现快速排序(Quicksort)的算法详解的使用技巧和注意事项,需要的朋友参考一下 目前,最常见的排序算法大概有七八种,其中"快速排序"(Quicksort)使用得最广泛,速度也较快。它是图灵奖得主C. A. R. Hoare(1934--)于1960时提出来的。 "快速排序"的思想很简单,

  • 我极度困惑。其中一个测验问题是"True or False, Quick ort在算法的征服阶段实现排序",我选择了true,因为我记得读过: 快速排序的三个步骤如下: 分割:重新排列元素,并将阵列分割为两个子阵列和中间的一个元素,以便左子阵列中的每个元素小于或等于中间元素,右子阵列中的每个元素大于中间元素。 征服:递归地对两个子数组排序。 组合:无。 然而,测验的答案说答案是错误的,没有任何解释

  • 我有一个servlet,我试图从包含svg代码的字符串中创建一个pdf。因此我有这个代码: 执行时,我得到以下错误: 当我检查我的构建路径时,似乎 Batik 1.8 存档文件中包含的所有 JAR 都从以下位置下载:。但是类不存在。如何导入所有必要的 JAR/类,为什么它们不包含在标准 zip 中?现在快把我逼疯了...或者是否有更简单的方法将 SVG 转换为 PDF?