堆排序的时间复杂度

时间:2019-06-24 13:46:37

标签: algorithm sorting time-complexity heap heapsort

我到处都读到,在最坏的情况下,堆排序的时间复杂度为O(nlog(n))。但是我们也到处都读到,在O(n)中内置堆是一个普遍的误解。相反,您可以在O(n)中堆放。因此,考虑到可以在n中进行堆操作,请查看下面的排序算法,并告诉我在分析其时间复杂性时哪里错了。

  1. O(n)个元素放入堆中(时间:O(n)
  2. 直到堆为空,弹出每个元素并将其复制到数组中。 (时间:O(n)。为什么?因为可以用相同的方式将所有元素放入O(n)中的堆中,所以也可以在O(n)+O(n)中提取所有元素。是吗?)。 / li>

总而言之,复杂度为O(n),即O(n)。但是在这里,我们还需要另外存储O(nlog(n))

我知道传统的堆排序的时间复杂度为O(1),而内存复杂度为O(n)。但是这不是堆排序吗?与传统的堆排序算法不同,它甚至可以在最坏的情况下提供var ident = "wowowowow"; console.log(getIdentifierName(ident)); function getIdentifierName(identifier) { for (var prop in window) { if (window[prop] === identifier) { console.log(identifier); } } }

1 个答案:

答案 0 :(得分:1)

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

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