我正在使用这个简单的实现。我只是想算一下比较。代码下面实际上有效。
列表为[3, 9, 8, 4, 6, 10, 2, 5, 7, 1].
比较计数的答案是25但我得到30.我无法弄清楚原因。是什么原因导致这个代码比它应该做的“更多工作”?提前谢谢!
public void sort(int[] values){
int length = values.length;
if(values == null || length == 0){
return;
}
quicksort(values, 0, length-1);
}
private int partition(int arr[], int left, int right){
int i = left+1;
int pivot = arr[left];
for(int j=(left+1); j<=right; j++){
comparisonCount++;
if(arr[j] < pivot){
swap(arr,i,j);
i++;
}
}
swap(arr,left, i-1);
return i;
}
private void quicksort(int arr[], int left, int right) {
int index = partition(arr, left, right);
if (left < index - 1){
quicksort(arr, left, index-1);
}
if (index < right){
quicksort(arr, index, right);
}
}
private void swap(int[] arr, int i, int j){
int tmp;
tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
答案 0 :(得分:0)
好吧,我似乎找到了差异的来源:
quicksort(values, 0, length - 1); // initial call in sort()
for (int j = (left + 1); j <= right; j++) { // loop in partition()
对战
quicksort(values, 0, length); // initial call in sort()
for (int j = (left + 1); j < right; j++) { // loop in partition()
第一个给出30个比较,第二个给出25个。
为什么是这种情况?我怀疑它与如何设置循环不变量有关。我的猜测是,由于边界的设置方式,您需要多次比较一些数据。我脑子里已经死得太精确,无法弄清楚确切的界限,所以一旦我弄明白,我就会记得回来。