是否存在比O(n log n)运行得更快的通用元素(与计数排序或桶排序不同)的实用算法?
答案 0 :(得分:23)
许多人已经提到了在比较排序算法上绑定的信息理论Ω(n lg n),这种算法无法在比较排序中被打破。 (This earlier question探讨了为什么会这样。)
但是,有些类型的比较排序虽然在平均情况下不会破坏O(n lg n),但可以显示在已经在某种程度上预先排序的输入上运行得更快。例如,Dijkstra的smoothsort在已经排序的输入上以O(n)运行,具有O(n lg n)最坏情况行为。我最喜欢的一种,Cartesian tree sort,可以在一些指标中充分利用预先排序的优势。例如,它可以在时间O(n)中对具有恒定数量的递增或递减子序列的任何序列进行排序,在最坏的情况下优雅地降级为O(n lg n)。
关于非比较排序的主题,有一些着名但棘手的整数排序算法超过O(n lg n)bynp做巧妙的位操作技巧。最着名的整数排序算法是一种可以在O(n√lglgn)中排序的随机算法,而用于整数排序的最快确定性算法在O(n lg lg n)时间内运行。您可能听说过基数排序在O(n)中有效,但从技术上讲它是O(n lg U),其中U是要排序的数组中的最大值。
简而言之,不,你不能比O(n lg n)做得更好,但如果你对输入有所了解,你可以做得更好。
答案 1 :(得分:3)
对于只能比较而不能访问内部的通用元素,不可能有比Theta(n log n)更快的排序算法。那是因为有n! (n阶乘)元素的可能顺序,你需要Theta(n log n)比较来区分所有元素。
答案 2 :(得分:3)
有多少元素?即使它类似于N 1.2 ,Shell-Metzner排序通常比大多数其他元素(或左右)更快。
它还取决于你的“通用”和“实用”的含义。基数排序可以超过O(n log n),它适用于各种各样的数据(但绝对不是一切)。
如果你的实用和通用的想法将算法限制为直接比较元素的算法,那么没有 - 什么(或永远都不能)比O(n log n)更好。这已经证明了很长一段时间。
答案 3 :(得分:2)
没有。这是我们拥有的几个严格的算法最小边界之一。对于n个元素的集合,有n个!不同的顺序,所以要指定给定的顺序,我们需要log(n!)位。通过斯特林的近似,这大约是n log n。对于我们在元素之间进行的每次比较,我们基本上得到一点信息(忽略了相等元素的可能性)。