快速排序算法中枢轴的选择

时间:2013-06-20 05:57:38

标签: algorithm sorting data-structures quicksort

我正在学习快速排序。我知道当分量值执行不平衡分区时,快速排序执行得很糟糕,因此第一个元素或最后一个元素不是一个好选择,因为如果列表几乎被排序,则分区将是不平衡的。

我搜索时找到了2个选项:

一种是在(最低指数)和向上(最高指数)之间随机选择一个支点。这似乎是一个安全的选择,但随机数生成器非常耗时。

其次是取所有元素的中位数。这个选项很昂贵,因此第一个,最后一个和中间元素的中位数可以用作枢轴元素。

哪种方法被证明是最有效的快速排序?..有没有其他方法可用于选择枢轴元素?

3 个答案:

答案 0 :(得分:5)

是的,如果您担心数组被排序或接近排序,您可以按照建议继续应用更多精力来选择一个好的数据透视,但如果您的数据未排序,则会以降低算法速度为代价。 Skienna在The Algorithm Design Manual中对枢轴选择进行了很好的讨论,他建议你在应用quicksort之前可以随机化数组,但我猜测如果你是,另一种排序算法会更好。 担心。

  

哪种方法被证明是最有效的快速排序?

此处的关键是对您的数据执行效果测量

答案 1 :(得分:3)

快速排序没有单一的“最有效”选择。你可以通过花费额外的时间来选择每个支点,或者你有一些输入的病态(O(N 2 ))行为来减慢某些(很多?)情况的排序。花费更多时间选择枢轴会减慢某些输入的排序速度,同时加快其他情况。这总是一种权衡。您可以选择一种权衡来提高您所期望的输入速度。

在现实世界中,我们可以使用introsort相当便宜地预防病理病例。病态情况的一个特征是深度递归,因此introsort检测深度递归并切换到不同的(但保证为O(N log N))算法。

答案 2 :(得分:0)

如果您真的担心最坏的情况,请在每次递归调用中随机化子数组,这样可以保护您免受最坏情况的影响。