gpt4 book ai didi

algorithm - 为什么 QuickSort Single pivot 比 3-way partition 更快?

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:02:53 24 4
gpt4 key购买 nike

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

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

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

重复数据:

  • 基本快速排序: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

最佳答案

首先去掉构造函数中的困惑以获得正确的比较。

其次,该行为是预期的,因为在基本版本中,如果您在两边都找到合适的候选者,即在 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++;
}


}

关于algorithm - 为什么 QuickSort Single pivot 比 3-way partition 更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17080128/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com