与其他排序算法的比较

堆排序仍然被经常使用的主要原因之一是它的可靠性,尽管它经常被实施良好的快速排序所超越。

就时间复杂度和安全性而言,堆排序的主要优点是O(n * logn)上限。Linux内核开发人员对使用堆排序而不是快速排序给出了以下理由:

平均和最坏情况下,堆排序的排序时间均为O(n * logn)。尽管qsort平均快20%,但它遭受O(n * n)可利用的最坏情况的行为以及额外的内存需求,从而使其不太适合内核使用。

此外,快速排序在可预测的情况下表现不佳,并且如果对内部实现有足够的了解,则可能会引发安全风险(主要是DDoS攻击),因为很容易触发不良的O(n 2)行为。

堆排序经常被比较的另一种算法是合并排序,它具有相同的时间复杂度。

合并排序的优点是稳定且直观可并行化,而堆排序都不是。

另一个要注意的是,即使堆排序具有相同的复杂度,大多数情况下堆排序也比合并排序慢,因为堆排序的常数因子更大。

但是,堆排序可以比合并排序更轻松地就地实现,因此当内存比速度更重要时,它是首选。

结论

正如我们所看到的,堆排序不像其他高效的通用算法那样流行,但是其可预测的行为(不是不稳定的)使其成为在内存和安全性比运行时间略微重要的地方使用的出色算法。

实现和利用Python随附的内置功能非常直观,我们要做的基本上就是将物品放进堆中并取出-类似于硬币计数器。