Java 什么';双枢轴快速分拣和快速分拣的区别是什么?
我以前从未见过双枢轴快速排序。 它是快速排序的升级版吗?Java 什么';双枢轴快速分拣和快速分拣的区别是什么?,java,sorting,quicksort,Java,Sorting,Quicksort,我以前从未见过双枢轴快速排序。 它是快速排序的升级版吗? 双枢轴快速排序和快速排序之间有什么区别?我在Java文档中找到了这一点 排序算法是一种双枢轴快速排序算法 弗拉基米尔·雅罗斯拉夫斯基、乔恩·本特利和约书亚·布洛赫。该算法 在许多导致其他问题的数据集上提供O(n log(n))性能 快速排序将降级为二次性能,通常是 比传统(单轴)快速排序实现更快 然后我在谷歌搜索结果中找到了这个。 快速排序算法原理: 从数组中拾取一个称为轴的元素 对数组重新排序,使小于轴的所有元素位于轴之前 轴和大于轴的
双枢轴快速排序和快速排序之间有什么区别?我在Java文档中找到了这一点 排序算法是一种双枢轴快速排序算法 弗拉基米尔·雅罗斯拉夫斯基、乔恩·本特利和约书亚·布洛赫。该算法 在许多导致其他问题的数据集上提供O(n log(n))性能 快速排序将降级为二次性能,通常是 比传统(单轴)快速排序实现更快 然后我在谷歌搜索结果中找到了这个。 快速排序算法原理:
- 第一部分,索引从左+1到左-1,元素小于P1
- 第二部分,指数从L到K–1,元素大于或等于P1,小于或等于P2
- 第三部分,指数从G+1到右侧-1,元素大于P2
- 第四部分包含要用从K到G的指数检查的其余元素
对于感兴趣的人,请看一下他们是如何在Java中实现此算法的: 如资料来源所述: “如果可能合并,请使用给定的工作区数组切片对数组的指定范围进行排序
该算法在许多数据集上提供O(n log(n))性能,这些数据集会导致其他快速排序降级为二次性能,并且通常比传统(单轴)快速排序实现更快。”我只想从算法的角度补充一点(即成本仅考虑比较和交换的数量),2轴快速排序和3轴快速排序即使不差,也不比经典快速排序(使用1轴)好。 然而,它们在实践中更快,因为它们利用了现代计算机体系结构的优点。具体来说,它们的缓存未命中数更小。所以,如果我们删除所有缓存,只有CPU和主内存,在我的理解中,2/3-pivot快速排序比经典的快速排序更糟糕 参考资料: 3轴快速排序: 分析其性能优于经典快速排序的原因:
完整且不太详细的参考资料:非常感谢。我得到了正确的答案。@GregHewgill非常感谢。我得到了正确的答案。@GregHewgill当我有这个问题并搜索Google时,它把我带到了这里。我很高兴Barrody_JL问了这个问题,其他人也回答了这个问题!:)这就是为什么我们非常感谢Java库设计人员,我们不必实现我们自己的排序算法,否则我们都将使用冒泡排序;-)在步骤7之后和步骤8之前,可以将P1与P2进行比较。如果它们是相同的值,这意味着第二部分不需要排序,它们是P1和P2的重复项。为什么17用于插入排序。它是任意的吗?@abksrv,MergeSort是
O(n logn)
,InsertionSort是O(n^2)
,然而这实际上是C1*n*log(n)
和C2*n*n
(其中C1和C2是一些常量)。当n
较大时,常数不相关。当n
较小时,它们可能是相关的。据推测,实施者调查发现17是临界点:C1*log(17)>C2*17
,但C1*log(18)
。雅罗斯洛夫斯基的原始论文()将27而不是17设置为使用插入排序的阈值。另一方面,Yaroslovsky、Bentley和Bloch()在Java8中的实现使用47作为阈值。可能是这里最好的。最后一个链接已过时。你还有文件吗?你可以在这里找到所有更新的课程: