Java 简单的快速排序实现,具有第一个元素枢轴和蛮力计数比较

Java 简单的快速排序实现,具有第一个元素枢轴和蛮力计数比较,java,quicksort,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; }

我正在使用这个简单的实现。我只想计算一下比较。下面的代码实际上是有效的。 列表是
[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;
}
public void排序(int[]值){
int length=values.length;
如果(值==null | |长度==0){
返回;
}
快速排序(值为0,长度为1);
}
私有整数分区(整数arr[],整数左,整数右){
int i=左+1;
int pivot=arr[左];

对于(intj=(左+1);j我似乎已经找到了差异的来源:

quicksort(values, 0, length - 1); // initial call in sort()
for (int j = (left + 1); j <= right; j++) { // loop in partition()
quicksort(值,0,长度-1);//sort()中的初始调用

对于(int j=(左+1);j你试过使用调试器吗?是的。没有什么引起我的注意。真的吗?你在调试模式下看到的一切都与你期望的相符?因此,程序似乎在毫无理由地打印
30
?它没有毫无理由地打印30。似乎没有什么问题。我的意思是,很明显是这样。如果你要你自己修改快速排序算法,并将其与计算机正在做的事情进行比较,你和计算机是否匹配?如果最终答案不是你所期望的,你们两个必须在某个地方分歧…很好的回答!谢谢。我记得我在设置边界时遇到过类似的问题。我总是更喜欢i@Matt一个接一个的错误是任何人都不会犯的错误你可以做,不仅仅是新手。不得不说,新手可能会更频繁地遇到它们,因为你正在重新实现函数来学习它们,在你以后的编程生涯中,你会使用库。避免这种情况的好方法是在编码之前确保你知道循环不变量,但即使这样,也很容易出错,alb如果你这样做的话,它会更容易被抓住。不得不说,
i
很可能是Java/C/C++/C#惯例胜过任何东西;其他语言(如MATLAB,如果内存可用的话)实际上更喜欢
i Upvote!没错,任何人都可能犯这个错误。关于MATLAB的有趣的事实。
quicksort(values, 0, length); // initial call in sort()
for (int j = (left + 1); j < right; j++) { // loop in partition()