![](/img/trans.png)
[英]Partition Implementation for Recursive Quicksort in Java is not working
[英]Recursive QuickSort in java not working
我試圖在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分區方案。 但是,在Wikipedia中,偽代碼for j := lo to hi - 1
表示for j := lo to hi - 1
,這是基於Pascal語法的。 在類似Pascal的語言中,這意味着j
的最后一個值為hi - 1
。 在Java之類的類似C的語言中,我們通常使上限值成為索引將具有的最后一個值之后的值,而不是最后一個值。 這意味着在您的代碼中, j
實際上不會具有值hi - 1
。 修復for
循環以確保j
確實取值r-1
可以使您的示例正常工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.