双枢轴快速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的研究:

  1. 从数组中选取一个称为数据透视表的元素。
  2. 对数组重新sorting,使得所有小于主元的元素都出现在主元之前,并且所有大于主元的元素都出现在主元之后。 分区之后,枢轴元件处于其最终位置。
  3. recursion地sorting较小元素的子数组和较大元素的子数组。

相比之下,双枢轴快速sorting:

插图

  1. 对于小数组(长度<17),使用插入sortingalgorithm。
  2. select两个主元素P1和P2。 例如,我们可以得到第一个元素a [left]作为P1,最后一个元素a [right]作为P2。
  3. P1必须小于P2,否则它们被交换。 所以,有以下几个部分:
    • 第一部分的索引从左+ 1到L-1的元素小于P1,
    • 第二部分,指数从L到K-1的元素大于或等于P1,小于或等于P2,
    • 第三部分指标从G + 1到右1,元素大于P2,
    • 第四部分包含了其他要检查的元素,指数从K到G.
  4. 将来自部分IV的下一个元素a [K]与两个枢轴P1和P2进行比较,并放置到相应的部分I,II或III。
  5. 指针L,K和G在相应的方向上改变。
  6. 当K≤G时,重复步骤4-5。
  7. 主元素P1与来自部分I的最后元素交换,主元素P2与来自部分III的第一元素交换。
  8. 对于每个部分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实现更快。