堆排序
堆的特征:

近似的完全二叉树,除了最底层外,该树是完全充满的。
堆的元素下标满足
i
2i 2i+1
最大堆:
父节点 >= 子节点
堆中的最大元素存在根节点中
最小堆:
父节点 <= 子节点
堆中的最小元素存在根节点中
调整为最大堆
把堆A中, 以下标i为根的子堆调整为最大堆。
MAX-HEAPIFY(A, i)
l = left(i)
r = right(i)
if l<=A.heap-size and A[l] > A[i]
largest = l
else
largest = i
if r <= A.heap-size and A[r] > A[largest]
largest = r
if largest != i
exchange A[i] with A[largest]
MAX-HEAPIFY(A, largest)
自底向上建堆:
(n/2)+1 ~ n 都是叶子节点。
BUILD-MAX-HEAP(A)
A.heap-size = A.length
for i = [A.length/2] downto 1
MAX-HEAPIFY(A, i)
堆排序算法:
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)
因为,我们总是保持A[1]是目前堆里的最大值,通过exchange A[1] with A[i],我们把它放到合适的位置。