堆即为使用数组表示的完全二叉树。

树某节点的高度为自最下往上数到此节点的边数,树的高度为根节点的高度。 某节点的深度为自根节点到此节点的边数。

完全二叉树叶子节点必须在最下边两层,最下层叶子必须在左边。

表示堆的数组A ,lenth[A]是数组中的元素个数,heap-size[A]是存放在数组A中堆的元素个数。 heap-size[A]<=lenth[A]。树的根为A[1]。 给定某个节点下标i, parent(i)=i/2  left(i)=2i,right(i) = 2i+1。

 

最大堆和最小堆

除根节点以外的每一个节点,有A[parent(i)]>=A[i] (或<=)

 

具有n个元素的堆,其高度为logn。

Max-Heapify

保持最大堆。

Max-Heapify(A,i) 输入一个数组A,和下标i。 保持元素A[i]大于其所有子女。

伪代码:

Max-Heapify(A,i)

l = left(i)    (左孩子下标)

r = right(i)

if(l <=heap-size[A] && A[l]>A[i])

then largest = l

else

largest = i

if(r<=heap-size[A]  && A[r] >largest)

then largest = r

if(largest !=i)

then exchange A[i] A[largest]

Max-Heapify(A,largest)

建堆

Bulid-Max-Heap(A)

从数组n/2 处开始遍历Max-Heapify, 即可。   因为n/2 +1 个元素起,它的左孩子n+2 已经大于堆最大元素,所以它不存在子节点,即为叶子节点,所有不需要保持最大堆。

 

堆排序

先建立最大堆,然后将根节点与堆最后一个元素互换,并将堆元素个数减一,然后再次建立最大堆。依次循环,直到堆中只剩根节点元素。

 

 

你可能感兴趣的:(Algorithm)