我正在尝试实现一个循环运行的hoare快速排序方法。我正在使用下面的算法。所以现在它输入: 10,7,8,9,15,例如,当我运行它时,输出:5,7,8,9,1,10,它只从数组中切换2个元素。为什么要停下来?我哪里出错了?
算法:
H 226G 227/code>。代码:
public static void swap (int[] a, int i, int j) {
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}
public static int median (int []a) {
int rnd = new Random().nextInt(a.length);
int M = a[rnd];
return M;
}
private static int partition(int[] a, int i, int M, int j) {
while (i <= j) {
while (a[i] < M) {
i++;
}
while (a[j] > M) {
j--;
}
if (i <= j) {
swap(a,i, j);
i++;
j--;
}
}
return i;
}
public static int[] secondMethod(int[] a) {
int N=a.length;
int left [] = new int [N/2];
int right [] = new int [N/2];
left[0]=0;
right[0]=a[N-1];
int stackpos = 1;
stackpos--;
int I = left[stackpos];
int r = right[stackpos];
int M=median(a);
int i=I;
int j=r;
partition(a,i,M,j);
if (i<=j) {
while (a[i] < M) {
i++;
}
}
if (i<r) { //10.
left[stackpos]=i;
right[stackpos]=r;
stackpos++;
}
r=j; //11.
if (I<r) {
while(true) {
M = median(a);
break;
}
}
if (stackpos>0) {
while(true) {
stackpos--;
I = left[stackpos];
r = right[stackpos];
break;
}
}
return a;
}
public static void main(String[] args) {
int []a = {10, 7, 8, 9, 1, 5};
a = secondMethod(a);
System.out.println("result :");
for (int i = 0; i < a.length; i++)
System.out.print(a[i] + " ");
}
}发布于 2020-02-28 14:25:20
有几件事是不对的。
right[0]=a[N-1]; # <-------------- pretty sure this should just be N-1, not a[N-1]第二个,也许更糟糕的是,分区只被调用一次。
你得把整件事想清楚。您解释算法的方式和立即突破的while(true)循环使这一点变得显而易见。
我的建议是:先做一个递归的快速排序,让自己熟悉算法。也是为了摆脱你的反复思维。然后熟悉将递归转换为迭代方法的一般方法(堆栈、动态规划)。然后把你所学到的东西应用到快速排序中。
如果您愿意,您当然可以在线寻找迭代的快速排序实现。我找到了一个使用堆栈而不是递归的。老实说,这是一个很好的练习,但我怀疑快速排序是否真的能从迭代中获益。然而,其他算法肯定是这样的,所以实践总是很好的。
https://stackoverflow.com/questions/60452693
复制相似问题