algorithm - 堆排序的时间复杂度

标签 algorithm sorting time-complexity heap heapsort

<分区>

我到处都读到堆排序的时间复杂度在最坏的情况下是O(nlog(n))。但我们也到处都读到,认为堆是在 O(nlog(n)) 中构建的是一种常见的误解。相反,您可以在 O(n) 中创建一个堆。所以考虑到一个堆可以在O(n)中做出来,看看下面的排序算法,告诉我在分析它的时间复杂度时我错在哪里。

  1. n个元素放入堆中(时间:O(n))
  2. 直到堆为空,弹出每个元素并将其复制到一个数组中。 (时间:O(n)。为什么?因为以同样的方式,所有元素都可以在 O(n) 中放入堆中,也可以提取所有元素在 O(n) 中。对吧?)。

总而言之,复杂度是 O(n)+O(n)O(n)。但是在这里,我们还需要额外的O(n)内存。

我知道传统堆排序的时间复杂度为O(nlog(n)),内存复杂度为O(1)。但这不也是堆排序吗?与传统的堆排序算法不同,即使在最坏的情况下,它也能提供 O(n)

最佳答案

请注意,如果没有关于数据的任何附加信息,您无法在 O(n) 中对数组进行排序。实际上,我们可以在使用基于 comaprison 的算法时证明对数组进行排序的 O(nlogn) 的下界!出于同样的原因,我们可以在 Heaport 上证明下界!

意思是 - 你不能永远在 O(n) 中对任何数据结构进行排序!任何线性排序算法都必须假设有关您的数据的一些先验知识。 有关如何证明 O(nlogn) 的下界的更多信息,请搜索“决策树”

关于algorithm - 堆排序的时间复杂度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56737985/

相关文章:

python - 在 Python 中为哈希函数实现我自己的哈希算法

c - 创建链表的困难

algorithm - 分解出一个符号方程算法

algorithm - 复杂度 - 输入长度

algorithm - 三元搜索的递归关系

c++ - 谁能检查这个 Palindrome c++ 代码是否正确?

寻找最佳可用时间的算法

c++ - 对多个数据成员进行排序

JQuery 表排序器 : How to show the arrows on one column only

optimization - 内存分配的时间复杂度