java - 计算快速排序比较

标签 java sorting quicksort

我实现了一个简单的快速排序(下面的代码)来计算快速排序所做的平均比较和最差比较。我声明了一个全局变量来保存用于比较的计数器。我在不同的位置放置了 3 个计数器,我认为这些计数器可以对比较进行计数,问题是计数器的总和与快速排序进行的比较总数的理论值不匹配。我试图解决这个问题几个小时,但没有成功。如果你能指出我应该把计数器放在哪里以及为什么我应该把它们放在那里,我真的很感激。我认为计数器应该放在进行比较的地方。显然我错了。

public int[] quickSort(int[] array, int start, int end){


    if (start < end){
        counter++;//1st comparison here
        int pivot;  

        pivot = Partition(array, start, end);
        quickSort(array, start, pivot - 1);
        quickSort(array, pivot + 1, end );
    }
return  array;
}

private int Partition(int[] array, int start, int end) {
    int pivot = array[end];
    int i = start - 1;

    for(int j = start; j <= end - 1; j++){

        counter++;//2nd comparison here


        if (array[j] <= pivot){
            counter++;//3rd comparison here
            i = i + 1;

            int temp = array[i];
            array[i] = array[j];
            array[j] = temp;
        }

    }

    int temp = array[i+1];
    array[i+1] = array[end];
    array[end] = temp;

    return i + 1;
}

最佳答案

理论上,只计算数组元素的比较,不计算索引与边界的比较,所以你应该只留下第二个counter++;(你需要独立地递增计数器比较结果)。

然后是您比较哪些理论值的问题。快速排序有不同的实现,它们使用的比较次数略有不同。特别是,您对枢轴的选择不会试图避免极值,因此此实现很容易退化为 O(n^2) 行为。

关于java - 计算快速排序比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9646233/

相关文章:

java - Tomcat的性能压力测试

java - 程序运行正常但是显示很多错误

c++ - 我的合并排序算法没有得到正确答案

java - 安卓存储建议?

java - 从我的应用程序中注销 Google

r - 如何按可变列数对数据框进行排序?

C:按给定排序对结构列表进行排序

python - 针对超大数据集的快速排序问题

java - 双轴快速排序和快速排序有什么区别?

c++ - 计算快速排序算法中组件明智比较的数量。