简单的QuickSort实现,具有第一个元素枢轴和强力计数比较

时间:2014-05-19 23:57:32

标签: java quicksort

我正在使用这个简单的实现。我只是想算一下比较。代码下面实际上有效。 列表为[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;
}

1 个答案:

答案 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个。

为什么是这种情况?我怀疑它与如何设置循环不变量有关。我的猜测是,由于边界的设置方式,您需要多次比较一些数据。我脑子里已经死得太精确,无法弄清楚确切的界限,所以一旦我弄明白,我就会记得回来。