java中的快速排序算法排序不正确(第一个元素作为枢轴)
我正在做一项任务,我们应该在其中实现快速排序,第一个元素作为轴心。我的代码中有一个小错误,导致列表中的元素(用于测试)排序错误。输出应该是1 3 7 8 9 10,但最终是1 7 3 8 9 10(7和3应该切换位置)。我怀疑错误可能在第15-26行之间,但我似乎找不到它,尽管有很多人试图修复它 谁能看出有什么不对劲 (在第一个while循环中,我尝试了使用I-lo){ 返回; } int pivot=a[lo]; int i=lo; int j=hi+1; 内部温度; i++; j--; 而(ijava中的快速排序算法排序不正确(第一个元素作为枢轴),java,algorithm,quicksort,Java,Algorithm,Quicksort,我正在做一项任务,我们应该在其中实现快速排序,第一个元素作为轴心。我的代码中有一个小错误,导致列表中的元素(用于测试)排序错误。输出应该是1 3 7 8 9 10,但最终是1 7 3 8 9 10(7和3应该切换位置)。我怀疑错误可能在第15-26行之间,但我似乎找不到它,尽管有很多人试图修复它 谁能看出有什么不对劲 (在第一个while循环中,我尝试了使用I-lo){ 返回; } int pivot=a[lo]; int i=lo; int j=hi+1; 内部温度; i++; j--; 而(
如果(i这可以解决您的问题:
public static void quickSort(int[] a, int lo, int hi) {
if (!(hi > lo)) {
return;
}
int pivot = a[lo];
int i = lo - 1;
int j = hi + 1;
int temp;
while (i < j) {
do {
i++;
} while (a[i] < pivot);
do {
j--;
} while (a[j] > pivot);
if (i < j) {
switchPlace(a, i, j);
i++;
j--;
}
}
switchPlace(a, lo, j);
quickSort(a, lo, j - 1);
quickSort(a, j + 1, hi);
}
publicstaticvoidquicksort(int[]a,int-lo,int-hi){
如果(!(高>低)){
返回;
}
int pivot=a[lo];
int i=lo-1;
int j=hi+1;
内部温度;
而(ipivot);
if(i
我将在这里介绍调试此类算法的简单方法,包括:
print
消息,但通常它可以是其他的东西(例如步骤调试器)
qsort算法的主要操作是围绕轴交换元素,以便较小的值在轴之前,较大的值在轴之后。 此过程发生在
lo
和hi
索引之间的各种子序列中
现在,让我们检查每个子序列是否正确执行了此操作。
为此,我们可以显示初始子序列,以及交换发生后的子序列,以便之后可以手动检查此操作是否正确执行
在交换部件之前,我们可以使用类似以下代码:
System.out.print("before: ");
for (int k = lo; k <= hi; k++) {
System.out.print(a[k] + ", ");
}
System.out.println();
System.out.print("after: ");
for (int k = lo; k <= hi; k++) {
System.out.print(a[k]);
if (k == j) {
System.out.print(" (pivot)");
}
System.out.print(", ");
}
System.out.println();
System.out.println();
图片和截图可以很好地添加到帖子中,但请确保没有它们的帖子仍然清晰有用。不要发布代码或错误消息的图片。而是直接复制粘贴或键入实际代码/消息到帖子中。是的,很抱歉,在我发布后才意识到。更改了。这可能有用谢谢!我会的看看@lakindu一开始似乎你的解决方案是有效的,因为它为
int[]a={9,3,10,1,8,7};
。尝试了另一个输入,但不幸失败。尝试了int[]a={24,2,45,20,56,75,2,56,99,53,12}
它给出了输出2 20 12 75 45 56 24 53 56 99
@Robert D.Mogos不要只说“这解决了它”。请指出您所做的更改,并对其进行修改。在第一个while循环中添加little=似乎可以达到目的!尽管这很奇怪,因为它以前不起作用,但我不会抱怨,因为它现在起作用了。非常感谢您详细的教育性回复,这非常有帮助@qwertyman@Isus没问题,很高兴能帮上忙。也许真的有请告诉我上次尝试在while循环中使用“=”后所做的其他修改。@Isus同样,我很高兴您看到这个答案具有教育意义。当它被否决时,我担心它可能听起来很傲慢:-),这绝不是我的本意。提出期望并检查它们是至关重要的(不管是基于使用打印、调试器还是其他任何技术),在编程课程中经常没有解释。我很可能做了一些其他的修改。虽然我不记得是哪一个,但我做了这么多的修改以发现错误。我认为你的答案非常广泛,解释得很好。当它被否决时,我自己感到惊讶,我不认为它听起来很傲慢:)@qwertyman
System.out.print("after: ");
for (int k = lo; k <= hi; k++) {
System.out.print(a[k]);
if (k == j) {
System.out.print(" (pivot)");
}
System.out.print(", ");
}
System.out.println();
System.out.println();
public static void quickSort(int[] a, int lo, int hi) {
if (!(hi > lo)) {
return;
}
int pivot = a[lo];
int i = lo;
int j = hi + 1;
int temp;
i++;
j--;
System.out.print("before: ");
for (int k = lo; k <= hi; k++) {
System.out.print(a[k] + ", ");
}
System.out.println();
while (i <= j) {
while (a[i] < pivot) {
i++;
}
while (a[j] > pivot) {
j--;
}
if (i <= j) {
switchPlace(a, i, j);
i++;
j--;
}
}
switchPlace(a, lo, j);
System.out.print("after: ");
for (int k = lo; k <= hi; k++) {
System.out.print(a[k]);
if (k == j) {
System.out.print(" (pivot)");
}
System.out.print(", ");
}
System.out.println();
System.out.println();
quickSort(a, lo, j - 1);
quickSort(a, j + 1, hi);
}
public static void switchPlace(int[] a, int x, int y) {
int temp = a[x];
a[x] = a[y];
a[y] = temp;
}
public static void printList(int[] a) {
String res = "";
for (int i = 0; i < a.length; i++) {
res += a[i] + " ";
}
System.out.println(res);
}
public static void main(String[] args) {
//int[] a = {3, 7};
//int[] a = { 9, 3, 10, 1, 8, 7 };
int[] a = {24, 2 , 45 ,20 ,56 ,75 ,2 ,56 ,99 ,53 ,12};
quickSort(a, 0, a.length - 1);
printList(a);
}