我的书中有一个Quicksort的伪代码,我正在逐步完成。但最终输出并不是我想要的。我把它变成了这段代码:
public class quickSort {
public int[] quick(int[] A, int p, int r){
int q;
if(p<r){
q = partition(A, p, r);
//First partition comfirmed to "work"
quick(A, p, q-1);
quick(A, q+1, r);
}
return A;
}
public int partition(int[] A, int p, int r){
int x = A[r];
int i = p-1;
int temp;
for(int j=p; j<r-1; j++){
if(A[j]<=x){
i = i+1;
temp = A[i];
A[i] = A[j];
A[j] = temp;
}
}
temp = A[i+1];
A[i+1] = A[r];
A[r] = temp;
return i+1;
}
}
我的书说明了如何处理第一个分区。输入:
2 8 7 1 3 5 6 4
..第一个分区将此“排序”为
2 1 3 4 7 5 6 8
..而且我已经确认了。所以,如果这项工作,它只是用较小的部分调用自己做同样的事情,为什么它最终给出输出:
2 3 1 4 5 7 8 7
..而不是排序的东西???
答案 0 :(得分:3)
错误是只会在[p, r-2]
而不是public int partition()
处理元素[p, r-1]
。 [r-1]可能恰好小于枢轴,但它没有交换并保持原位
答案 1 :(得分:0)
好吧,所以这里是你的答案调整,它的工作原理:
import java.util.Arrays;
public class QuickSort
{
public QuickSort()
{
int array[] = { 2, 8, 7, 1, 3, 5, 6, 4 };
quickSort(array, 0, array.length - 1);
System.out.println(Arrays.toString(array));
}
void quickSort(int[] array, int p, int r)
{
if (p < r)
{
int q = partition(array, p, r);
quickSort(array, p, q - 1);
quickSort(array, q + 1, r);
}
}
int partition(int array[], int p, int r)
{
int x = array[r];
int i = p - 1;
for (int j = p; j < r; j++)
{
if (array[j] <= x)
{
i += 1;
int temp = array[i];
array[i] = array[j];
array[j] = temp;
}
}
int temp = array[i + 1];
array[i + 1] = array[r];
array[r] = temp;
return i + 1;
}
public static void main(String[] args)
{
new QuickSort();
}
}
但到现在为止,我确定你必须知道出了什么问题。我不得不遵守我的话,这就是为什么我在这里更新我的答案。
答案 2 :(得分:0)
它应该是 for(int j = p; j&lt; = r-1; j ++)
public int partition(int[] A, int p, int r){
int x = A[r];
int i = p-1;
int temp;
for(int j=p; j<=r-1; j++){
if(A[j]<=x){
i = i+1;
temp = A[i];
A[i] = A[j];
A[j] = temp;
}
}
temp = A[i+1];
A[i+1] = A[r];
A[r] = temp;
return i+1;
}