【问题标题】:Why is QuickSort Single pivot faster than 3-way partition?为什么 QuickSort Single pivot 比 3-way partition 更快?
【发布时间】:2013-06-09 10:17:41
【问题描述】:

我正在尝试对 QuickSort(单轴、三轴和双轴)的性能进行粗略的基准测试。

问题 1: 恐怕我在实现 3 路分区时遗漏了一些东西。在针对随机输入(1000 万个)数字的多次运行中,我可以看到单个枢轴总是表现更好(尽管对于 1000 万个数字,差异在 100 毫秒左右)。

我了解 3-way 的全部目的不是重复键的 0 (n^2) 性能 - 当我针对重复输入运行它时,这一点非常明显。但是真的是为了处理重复数据,用3-way来取小罚分吗?还是我的实现不好?

重复数据:

  • 基本快速排序:888 毫秒
  • 快速排序 3 路:522 毫秒
  • 快速排序双枢轴:482 毫秒

随机数据:

  • 基本快速排序:1677 毫秒
  • 快速排序 3 方式:1717 毫秒
  • 快速排序双枢轴:1595 毫秒

问题 2:

Dual Pivot 实现(下面的链接)不能很好地处理重复。执行需要 0(n^2) 时间。有没有快进的好方法。我可以看到我们可以检查枢轴是否相等并增加枢轴1,直到它与枢轴2不同。这是一个公平的实现吗?

else if (pivot1==pivot2){
        while (pivot1==pivot2 && lowIndex<highIndex){
            lowIndex++; 
            pivot1=input[lowIndex];
        }
    }

实施链接:

根文件夹:https://github.com/arunma/dsa/tree/master/src/basics/sorting/quick

快速排序(单轴):https://github.com/arunma/dsa/blob/master/src/basics/sorting/quick/QuickSortBasic.java

快速排序(3 路分区): https://github.com/arunma/dsa/blob/master/src/basics/sorting/quick/QuickSort3Way.java

快速排序(双轴): https://github.com/arunma/dsa/blob/master/src/basics/sorting/quick/QuickSortDualPivot.java

测试用例: https://github.com/arunma/dsa/blob/master/src/basics/sorting/quick/QuickSortTest.java

【问题讨论】:

标签: algorithm sorting quicksort


【解决方案1】:

首先摆脱构造函数中的混乱以进行正确的比较。

其次,这种行为是预期的,因为在基本版本中,只有在双方都找到合适的候选者时才进行切换,即在 QuickSortBasic.java 中

    while (true){

        while (less(input[++i], input[pivotIndex])){
            if (i==highIndex) break;
        }

        while (less (input[pivotIndex], input[--j])){
            if (j==lowIndex) break;
        }

        if (i>=j) break;

        exchange(input, i, j);

    }

而 3way 版本您无论如何都在进行切换,除非元素等于枢轴,即在 QuickSort3Way.java 中

    while (i<=gt){


        if (less(input[i],pivotValue)){
            exchange(input, i++, lt++);
        }
        else if (less (pivotValue, input[i])){
            exchange(input, i, gt--);
        }
        else{
            i++;
        }


    }

【讨论】:

  • 答案旨在对其他人有用,而不仅仅是 OP。 “检查你的 github 拉取请求”对于下一个阅读这个答案的人来说不是很有用,从没有 6 个月。 .)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-01-18
  • 2013-02-01
  • 2011-05-01
  • 1970-01-01
  • 2019-11-02
  • 2010-12-28
  • 1970-01-01
相关资源
最近更新 更多