我正在尝试实现快速排序算法,这是我的代码:
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);
}
}
}
该代码确实对输入数组进行了排序,但是当我计算比较次数时,它给出的数字远大于原始比较次数。我加了一个断点,一步步移到代码中,发现问题出在最后两行:Partition(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 和 i = 3。然后第一次调用 Partition 需要 i (其中 i 等于 3)并不断更改 i 的值,当它最终完成时,i 的值与 3 不同,并且另一个错误值被发送到第二次递归调用。
我的问题是,有没有办法让这两个调用采用相同的参数 i,而无需任何人更改?