对于以程序员为生的人来说,这是一个问题 我刚刚证明(使用Master定理)如果我们使用quicksort并且我们选择枢轴作为我们正在分区的子阵列的中位数(使用中位数算法的中值,Θ(n)最坏情况运行时间)然后是最差的快速排序的案例运行时间是Θ(n lg n) - 所以基本上这意味着这个版本的快速排序是最好的。
我现在的问题是 - 有没有人在实践中实现这样的快速排序?或者它只是那些在现实生活中实际上并不好的理论事物之一?
PS - 我不需要证明我所说的内容,我只是想知道这是否广为人知/有用
答案 0 :(得分:4)
这是已知的(参见wikipedia条目),但由于实际上最坏的情况相对较少,因此通常认为O(N)选择算法在平均情况下增加的开销是不可接受的。
答案 1 :(得分:1)
这取决于你的工作地点。 到目前为止,就个人而言,我从未实际实施过 - 但我认为它根据您工作场所的要求而有所不同。
答案 2 :(得分:1)
当您围绕某个枢轴进行分区时,您已经拥有了枢轴的“质量”(它如何均匀地划分数组)。如果它低于某个阈值,您可以尝试一些更聪明的方法来选择枢轴。这样可以保持时间复杂度O(n * log n)并保持常量较低,因为很少进行复杂的选择。
如果我没有误解C ++ STL使用类似的东西,但我没有任何链接 - 那是来自工作的对话。
<强>更新强>
C ++ STL(至少是Visual Studio中的一个)似乎做了不同的事情:
如果迭代次数超过约。 1.5 log2(N)
,它切换到堆排序,即O(n * log n)。