平滑排序算法在哪里使用?

问题描述

在我的大学学习算法时,我遇到了称为Smoothsort的算法。这是一个很棒的算法,因为它是自适应算法,时间复杂度可以从线性复杂度到线性运算而变化,它也是就地算法。但是,该算法的资源非常稀缺,可用资源很难理解。但是,我发布此问题的原因是要了解用例,何时使用以及何时不使用?

这就是我想知道的一切,非常感谢您回答或复查此问题。

解决方法

musl libc使用Smoothsort来实现qsort()This Stack Overflow answer from the library author描述了这种推理:最坏的情况是O(n log n)(与Quicksort不同),就地(与mergesort不同)和自适应(与heapsort不同)。我认为Smoothsort对于以下产品的某种组合并没有太多使用

  • Smoothsort不稳定,并且在实践中通常比就地更需要稳定性,因为它意味着完全确定存在相同键的排序顺序。 musl具有C标准所允许的不稳定稳定性,并且设计目标之一是除非明确要求,否则不分配内存(例如,这就是musl strstr()不使用KMP的原因。

    请注意,存在就地,稳定的O(n log n)时间排序算法,但是常数因子太大而无法实用。

  • 适应性更佳,而Smoothsort比堆排序更复杂。

  • 由于几乎所有本科算法课程(甚至包括研究生课程,例如我在学校都没有看到它)的遗漏,Smoothsort并不广为人知。