双枢轴快速排序和快速排序有什么区别?

时间:2014-01-04 06:06:11

标签: java sorting quicksort

我以前从未见过双枢轴快速排序。 如果是快速排序的升级版本?
双枢轴快速排序和快速排序有什么区别?

3 个答案:

答案 0 :(得分:76)

我在Java doc中找到了这个。

  

排序算法是Dual-Pivot Quicksort         由Vladimir Yaroslavskiy,Jon Bentley和Joshua Bloch撰写。这个算法        在许多导致其他数据集的数据集上提供O(n log(n))性能         快速降级为二次性能,通常是         比传统(单枢轴)Quicksort实现更快。

然后我在Google搜索结果中找到了这个。 快速排序算法的理论:

  
      
  1. 从数组中选择一个名为pivot的元素。
  2.   
  3. 重新排序数组,使所有小于数据透视的元素都位于数组之前   枢轴和大于枢轴的所有元素都在它之后(相等的值可以去   无论哪种方式)。在此分区之后,枢轴元素处于其最终位置。
  4.   
  5. 递归排序较小元素的子数组和较大元素的子数组。
  6.   

相比之下,双枢轴快速排序:

Illustration

  
      
  1. 对于小型数组(长度<17),请使用“插入排序算法”。
  2.   
  3. 选择两个枢轴元素P1和P2。例如,我们可以获得第一个元素   a [left]为P1,最后一个元素a [right]为P2。
  4.   
  5. P1必须小于P2,否则它们会被交换。所以,有以下几个部分:      
        
    • 第一部分,索引从左+ 1到L-1,元素小于P1,
    •   
    • 第二部分,指数从L到K-1,含元素,大于或等于P1,小于或等于P2,
    •   
    • 第III部分,指数从G + 1到右1,元素大于P2,
    •   
    • 第IV部分包含要检查的其余元素,从K到G的索引。
    •   
  6.   
  7. 将来自部分IV的下一个元素a [K]与两个枢轴P1和P2进行比较,   并放置到相应的第I,II或III部分。
  8.   
  9. 指针L,K和G在相应的方向上发生变化。
  10.   
  11. 重复步骤4-5,同时K≤G。
  12.   
  13. 枢轴元素P1与第I部分的最后一个元素交换,   枢轴元件P2与第III部分的第一个元素交换。
  14.   
  15. 对于每个部分I,部分II和部分III,递归地重复步骤1-7。
  16.   

答案 1 :(得分:3)

对于那些感兴趣的人,看看他们如何在Java中实现这个算法:

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

如来源所述:

“如果可能的话,使用给定的工作空间数组切片对数组的指定范围进行排序

该算法在许多数据集上提供O(n log(n))性能,导致其他快速降序降级为二次性能,并且通常比传统(单轴)Quicksort实现更快。“

答案 2 :(得分:0)

我只是想从算法的角度进行补充(即,成本仅考虑比较和交换的数量),2-pivot quicksort和3-pivot quicksort并不比经典quicksort(使用1个枢轴)更好。 ,如果不更糟。 但是,由于它们利用了现代计算机体系结构的优点,因此它们在实践中速度更快。具体而言,它们的高速缓存未命中的数量较小。因此,如果我们删除所有缓存,并且只有CPU和主内存,那么据我所知,2 / 3-pivot快速排序比传统的快速排序更糟糕。

参考: 三轴快速排序:https://epubs.siam.org/doi/pdf/10.1137/1.9781611973198.6 分析为什么它们的性能要优于传统的Quicksort:https://arxiv.org/pdf/1412.0193v1.pdf 完整且不太详细的参考:https://algs4.cs.princeton.edu/lectures/23Quicksort.pdf