我在学数据结构和算法。所以我尝试实现了快速排序算法。
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
方法中,它会抛出索引越界异常
。因为没有这样的索引来检索/存储值。有谁能帮我解决这个问题吗?
我假设您试图实现来自维基百科的Lomuto分区方案。如果是这种情况,您的代码中有2个错误,都在partition
方法的for
循环中:
您的算法每次从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?