我正在尝试实现快速排序算法,这是我的代码:
public class Sort {
int count = 0;
public void Partition(int A[], int l, int h) {
if ((h-l) > 1) {
count += (h-l) - 1;
int pivot = A[l];
int i = l+1;
int temp;
int j;
for (j = l + 1; j < h; j++) {
if (A[j] < pivot) { // SWAP
temp = A[i];
A[i] = A[j];
A[j] = temp;
i++;
}
// else : j++
}
temp = A[i-1];
A[i-1] = A[l];
A[l] = temp;
Partition(A, l, i-1);
Partition(A, i, A.length);
}
}
}
代码确实对输入数组进行了排序,但是当我计算比较次数时,它给出的数字远大于原始比较次数。我加了断点,一步步移到代码中,发现问题出在最后两行: 分区(A,l,i-1); 分区(A,i,A,长度);
第二次调用中发送的“i”是第一次调用 Partition 函数产生的 i,而不是第一个代码中的“i”。例如,代码第一次在以下输入上运行: 3 8 4 6 10 2 5 7 1 输出为: 1 2 3 4 6 10 9 5 7 8 我= 3。 然后对 Partition 的第一次调用采用 i(其中 i 等于 3)并不断更改 i 的值,当最终完成时,i 的值与 3 不同,并且另一个错误值被发送到第二次递归调用。
我的问题是,有没有办法让两个调用采用相同的参数 i,而无需任何人更改它?
最佳答案
试试这个。不要尝试在 Partition
中进行排序;从那里,只需返回索引i
(当然,您必须将返回类型更改为int)。然后编写一个不同的方法来实现快速排序。
public static void quicksort(int[] n, int left, int right){
if (left<right){
int pivotindex=Partition(n, left, right);
quicksort(n, left, pivotindex-1);
quicksort(n, pivotindex+1, right);}
}
我用以下方法对此进行了测试,效果非常好。
public static void main(String[] args){
int[] n= new int[8];
n[0]=3;
n[6]=2;
n[1]=5;
n[3]=20;
quicksort(n, 0, n.length);
for (int i=0; i<n.length; i++){
System.out.print(n[i]+",");
}
}
关于java - 如何在递归中保持参数不变?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17795781/