通过数组实现二进制堆

时间:2013-10-04 15:41:16

标签: arrays sorting binary-tree binary-heap

我不想通过给定的数组创建二进制最大堆。我可以用两种方式实现它:
1.创建整个数组的堆,然后开始通过叶节点堆积到顶部 2.将一个元素逐个插入堆中,并同时堆积。

这两种方法都给了我一个最大堆,但它们彼此不同。那么哪种方法是正确的?

2 个答案:

答案 0 :(得分:1)

您可以以任何一种方式实现堆,并且两者都是正确的,因为它们遵循堆排序的基本规则,即父密钥必须比子节点中的任何一个更重要。虽然它们可能导致不同的堆。

方法-1-创建整个数组的堆并开始通过叶节点堆积到顶部。 通过这种方法,构造堆的比较数是O(N),即它需要线性的比较数,因此需要线性时间。

方法2-将一个元素从数组中逐个插入堆中并同时堆积。将元素插入到有序堆中需要平均进行logN比较。因此,同时插入N个项目和堆排序需要log1 + 2log2 + 3log3 + ... + NlogN~NlogN比较因此线性时间。

因此,方法一是优选的,因为它需要较少的比较次数,因此花费较少的时间。

答案 1 :(得分:0)

看两者是不同的:
1.当你逐个插入时:基本上你是插入已经是堆的二进制树并调用heapify
2.当您一次在数组中插入所有内容然后使其完全堆积时,您就不使用heapify(BuildHeap函数)。因为那不是一堆。

在插入已经是堆

的数组时使用Heapify

Read this