堆是一个数组,可以被看成一个近似的完全二叉树,除了最底层,该树是完全充满的。
二叉堆可以分成两种形式,最大堆和最小堆。
最大堆中,除了根以外的所有节点i都要满足:
A[PARENT(i)] >= A[i]
最小堆则相反。
堆结构上基本操作的运行时间至多与树的高度成正比,时间复杂度为O(lg n)
MAX-HEAPIFY过程:时间复杂度为O(lg n),维护最大堆性质
MAX-HEAPIFY(A,i)
l = LEFT(i)
r = RIGHT(i)
if l <= A.heap-size and A[l]>A[i]
largetst = l
else largest = i
if r <= A.heap-size and A[r]>A[largest]
largetst = r
if largest != i
exchange A[i] with A[largest]
MAX-HEAPIFY(A,largest)
BUILD-MAX-HEAP建堆,子数组A([n/2]+1...n)中的元素都是树的叶节点,每个叶节点都可以看成只包含一个元素的堆,过程BUILD-MAX-HEAP中对树中的其他节点都调用一次MAX-HEAPIFY
BUILD-MAX-HEAP(A)
A.heap-size = A.length
for i = A.length downto 1
MAX-HEAPIFY(A,i)
堆排序算法
首先利用BUILD-MAX-HEAP将输入数组A[1...n]建成最大堆,其中n=A.length。因为数组中最大元素总在根节点A[1]中,通过它与A[n]进行互换,可以让该元素放到正确的位置。此时,如果从堆中去掉节点n(通过令A.heap-size减一实现),剩余的节点中,原来根的孩子结点仍然是最大堆,而新的根节点可能会违背最大堆的性质,为了维护最大堆的性质,需要调用MAX-HEAPIFY(A,1)从而在A[1...n-1]上构造一个新的最大堆。堆排序算法就是不断重复这一过程,直到堆的大小从n-1降到2.
HEAPSORT(A)
BUILD-MAX-HEAP(A)
for i = A.length downto 2
exchange A[1] with A[i]
A.heap-size = A.heap-size - 1
MAX-HEAPIFY(A,1)