从阅读维基百科的this文章中对排序算法的看法,似乎smoothsort是最好的排序算法。它在所有类别中都有最佳表现:最佳,平均和最差。在任何类别中都没有什么比这更好的了。它还具有恒定的内存要求。唯一的缺点是它不稳定。
它在内存中击败了timsort,它在最坏情况下的性能和内存方面都快速进入。
但我从未听说过smoothsort。没有人提到它,大多数讨论似乎都围绕着其他排序算法。
为什么?
答案 0 :(得分:32)
Big-O性能非常适合发布论文,但在现实世界中我们也必须考虑常量。 Quicksort长期以来一直是不稳定,就地内存排序的首选算法,因为我们可以非常有效地实现其内部循环,并且它非常适合缓存。即使你可以像quicksort一样有效地或几乎同样有效地实现smoothsort的内部循环,你可能会发现它的缓存未命中率使它变慢。
我们通过花费更多精力选择好的枢轴(减少病理病例数)和检测病理病例来减轻速度最差的表现。查看introsort。 Introsort首先运行快速排序,但如果它检测到过多的递归(这表示快速排序的病态情况),则切换到heapsort。
答案 1 :(得分:8)
更好的渐近并不意味着更好的表现(虽然通常情况就是如此)。隐藏常量可能会大几倍,导致它比相对小尺寸的数组(其中相对较小的数组)的另一算法(具有相同甚至最差的渐近复杂性)慢事实上,可能是任意大小,例如10 100 。这是渐近分析)。但我对smoothsort隐藏常数一无所知。
例如,there is用于查找k阶统计量的O(n)最坏时间算法,但它太复杂,以至于O(n log n)最坏情况版本在大多数情况下都优于它。
此外,还有一个有趣的comparison:
......正如你所看到的,Timsort和Smoothsort都没有削减芥末。在所有情况下,Smoothsort都比STL排序更差(即使使用std:bitset替换为原始位操作)...
答案 2 :(得分:1)
首先,我会说它不像Smoothsort不出名。这取决于用户的需求,也取决于用户是否使用它。
smoothsort的优点是,如果输入已经在某种程度上排序,它接近O(n)时间,而无论初始排序状态如何,heapsort平均为O(n log n)。
来自Documentation: -
smoothsort算法需要能够在内存中保存大小 字符串中的所有堆。因为所有这些值都是 不同,这通常使用位向量来完成。而且,因为 序列中最多有O(log n)个数,这些位可以是 以O(1)机器字编码,假设是一个跨机器的机器 模型。