QuicksortinΘ(n lg n)

时间:2013-05-05 14:30:57

标签: algorithm sorting code-analysis quicksort

对于以程序员为生的人来说,这是一个问题 我刚刚证明(使用Master定理)如果我们使用quicksort并且我们选择枢轴作为我们正在分区的子阵列的中位数(使用中位数算法的中值,Θ(n)最坏情况运行时间)然后是最差的快速排序的案例运行时间是Θ(n lg n) - 所以基本上这意味着这个版本的快速排序是最好的。

我现在的问题是 - 有没有人在实践中实现这样的快速排序?或者它只是那些在现实生活中实际上并不好的理论事物之一?

PS - 我不需要证明我所说的内容,我只是想知道这是否广为人知/有用

3 个答案:

答案 0 :(得分:4)

这是已知的(参见wikipedia条目),但由于实际上最坏的情况相对较少,因此通常认为O(N)选择算法在平均情况下增加的开销是不可接受的。

答案 1 :(得分:1)

这取决于你的工作地点。 到目前为止,就个人而言,我从未实际实施过 - 但我认为它根据您工作场所的要求而有所不同。

答案 2 :(得分:1)

当您围绕某个枢轴进行分区时,您已经拥有了枢轴的“质量”(它如何均匀地划分数组)。如果它低于某个阈值,您可以尝试一些更聪明的方法来选择枢轴。这样可以保持时间复杂度O(n * log n)并保持常量较低,因为很少进行复杂的选择。

如果我没有误解C ++ STL使用类似的东西,但我没有任何链接 - 那是来自工作的对话。

<强>更新

C ++ STL(至少是Visual Studio中的一个)似乎做了不同的事情:

  1. 执行分区
  2. 通过递归无条件地对较小的部分进行排序(因为它不能大于O(n * log n)安全的一半)
  3. 在同一个循环中处理较大的部分(没有递归调用)
  4. 如果迭代次数超过约。 1.5 log2(N),它切换到堆排序,即O(n * log n)。