gpt4 book ai didi

java - java中的递归QuickSort不起作用

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:54:30 25 4
gpt4 key购买 nike

我正在尝试在 java 中实现快速排序,它以数组的最后一个元素为基准。然而,它似乎并没有工作,即使在纸面上它应该..

这是输出:

before sort: 5 2 3 1 4 

after sort: 3 2 4 5 1

预期的输出将是 1,2,3,4,5 但这似乎并没有发生。

public static void main(String[] args) {
int A[] = {5,2,3,1,0};
ArrayUtils.printArray("before sort", A);
quick_sort(A, 0, A.length-1);
ArrayUtils.printArray("after sort", A);
}

public static void quick_sort(int[] A, int p, int r) {
if (p < r) {
int q = partition(A, p, r);
quick_sort(A, p, q-1);
quick_sort(A, q+1, r);
}
}

我已经追踪到问题出在调试器的分区中,但我似乎无法找到它的位置。似乎 for 循环有时会产生错误的 i,但有时它会正常工作。我不确定,这就是我问的原因。

public static int partition(int A[], int p, int r) {
int x = A[r];
int i = p-1;
for(int j = p; j < r-1; j++) {
if (A[j] <= x) {
i = i + 1;
int temp = A[j];
A[j] = A[i];
A[i] = temp;
}
}
int temp = A[r];
A[r] = A[i + 1];
A[i + 1] = temp;
return i + 1;
}

printArray() 在哪里

public static void printArray(String name, int[] array) {
if (array.length >= 10) {
System.out.print(name + ": \n");
} else {
System.out.print(name + ": ");
}

for(int i = 0; i < array.length; i++) {
if (i % 10 == 0 && i > 0) {
System.out.print("\n");
}
System.out.print(array[i] + " ");

}
System.out.println("\n");
}

最佳答案

看起来你的分区算法看起来是基于 Wikipedia 中的 Lomuto 分区方案。 .但是,在维基百科中,伪代码表示 for j := lo to hi - 1,它基于 Pascal 语法。在类 Pascal 语言中,这意味着 j 的最后一个值是 hi - 1。在 Java 等类 C 语言中,我们通常将上界设为索引将具有的最后一个值之后的值,而不是最后一个值。这意味着在您的代码中,j 实际上永远不会具有值 hi - 1。修复 for 循环以确保 j 确实采用值 r-1 让一切正常,以您的示例为例。

关于java - java中的递归QuickSort不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40793178/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com