双枢轴快速sorting和快速sorting有什么区别?
我从来没有见过双枢轴快速sorting之前。 如果是快速sorting的升级版本?
双枢轴快速sorting和快速sorting有什么区别?
我在java文档中find了这个。
sortingalgorithm是由Vladimir Yaroslavskiy,Jon Bentley和Joshua Bloch编写的Dual-Pivot Quicksort。 该algorithm在许多数据集上提供了O(n log(n))性能,这些数据集导致其他快速sorting降低到二次性能,并且通常比传统(单枢轴)Quicksort实现更快。
然后我在谷歌search结果中find这个。 快速sortingalgorithm的研究:
- 从数组中选取一个称为数据透视表的元素。
- 对数组重新sorting,使得所有小于主元的元素都出现在主元之前,并且所有大于主元的元素都出现在主元之后。 分区之后,枢轴元件处于其最终位置。
- recursion地sorting较小元素的子数组和较大元素的子数组。
相比之下,双枢轴快速sorting:
- 对于小数组(长度<17),使用插入sortingalgorithm。
- select两个主元素P1和P2。 例如,我们可以得到第一个元素a [left]作为P1,最后一个元素a [right]作为P2。
- P1必须小于P2,否则它们被交换。 所以,有以下几个部分:
- 第一部分的索引从左+ 1到L-1的元素小于P1,
- 第二部分,指数从L到K-1的元素大于或等于P1,小于或等于P2,
- 第三部分指标从G + 1到右1,元素大于P2,
- 第四部分包含了其他要检查的元素,指数从K到G.
- 将来自部分IV的下一个元素a [K]与两个枢轴P1和P2进行比较,并放置到相应的部分I,II或III。
- 指针L,K和G在相应的方向上改变。
- 当K≤G时,重复步骤4-5。
- 主元素P1与来自部分I的最后元素交换,主元素P2与来自部分III的第一元素交换。
- 对于每个部分I,部分II和部分III,recursion地重复步骤1至7。
对于那些有兴趣的人,看看他们如何在Java中实现这个algorithm:
http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8u40-b25/java/util/DualPivotQuicksort.java#DualPivotQuicksort.sort%28int%5B%5D%2Cint%2Cint% 2Cint%5B%5D%2Cint%2Cint 29%
正如来源所述:
“如果可能的话,使用给定的工作区数组切片对指定的数组范围进行合并
该algorithm在许多数据集上提供了O(n log(n))性能,导致其他快速sorting降低到二次性能,并且通常比传统的(单枢轴)Quicksort实现更快。