为quicksort选择支点的更好方法是什么?

时间:2020-02-26 10:36:57

标签: pivot quicksort

有人告诉我,有一个Quicksort的优化枢轴列表,但是我在网上搜索后没有找到。 因此,此列表包含很多素数,但也包含许多其他素数(如今,我们无法解释为什么此枢轴是最好的)。 然后,如果您知道这件事或有一些文档,我很感兴趣。 如果您知道优化快速排序的另一种方法,我也很感兴趣。 预先感谢

2 个答案:

答案 0 :(得分:0)

使用数字列表的一种排序方式是短壳,其中数字用于“空白”:

https://en.wikipedia.org/wiki/Shellsort#Gap_sequences

对于快速排序,使用3的中位数会有所帮助,使用9的中位数会有所帮助,而中位数的中位数可以保证在最坏情况下O(n log(n))时间复杂度,但在大多数情况下都涉及一个较大的恒定因子,导致整体快速排序速度变慢。

https://en.wikipedia.org/wiki/Median_of_medians

具有合理的支点选择(随机数,中位数为3、9,...)的内向排序是常见的选择,如果递归级别变得太深,则切换到堆排序。

https://en.wikipedia.org/wiki/Introsort

答案 1 :(得分:0)

没有比选择列表的中间元素作为我们的枢轴更好的方法了。

为什么?

为数字列表找到轴的理想方法是随机找到轴。但是,额外的随机化过程会增加时间复杂度或空间复杂度。

如果我们仅选择第一个元素作为枢轴并说列表以某种方式“随机”怎么办? 如果列表已经排序并选择第一个元素作为枢轴,则该算法将生成具有O(n ^ 2)的时间复杂度,而不是我们的平均时间O(nlogn)。

因此,为了保证不使用额外的时间复杂度并且不使我们的算法退化。最快,最简单,最常见的修复方法是将列表的中间元素用作我们的枢纽。如果是这样,我们可以保证我们的算法为O(nlogn)。在这一点上,我们的算法退化非常困难,除非有目的地对其进行有序排序以使其退化。