堆排序时间复杂度: O ( n lg n ) O(n\lg n) O(nlgn),和归并排序一样
堆
一个近似完全的二叉树
- 根节点A[1]
- A[i]的父节点A[ ⌊ i / 2 ⌋ \lfloor i/2 \rfloor ⌊i/2⌋]
- A[i]左子节点A[2i]
- A[i]右子节点A[2i+1]
最大堆:子节点小于等于父节点,根节点最大,用于堆排序
(一个叶子节点本身是一个最大堆)
最小堆:子节点大于等于父节点,根节点最小,用于构造优先级队列
n个节点的堆的高度 ⌊ lg n ⌋ \lfloor \lg n \rfloor ⌊lgn⌋
维护堆的性质
最大堆
MAX-HEAPIFY(A,i) // Sub-tree rooted at node i
l = LEFT(i)
r = RIGHT(i)
if l < heap-size[A] and A[l] > A[i]
then largest = l
else largest = i
if r <= heap-size[A] and A[r] > A[largest]
then largest = r
if largest != i
then exchange A[i] and A[largest]
MAX-HEAPIFY(A,largest)
建堆
BUILD-MAX-HEAP(A)
heap-size[A] = length[A]
for i = length[A]/2 downto 1
do MAX-HEAPIFY(A,i)
时间代价 O ( n lg n ) O(n\lg n) O(nlgn)
堆排序算法
HEAPSORT(A)
BUILD-MAX-HEAP(A)
for i = length[A] downto 2
do exchange A[1] and A[i]
heap-size[A] = heap-size[A] - 1
MAX-HEAPIFY(A,1)
时间代价 O ( n lg n ) O(n\lg n) O(nlgn)
优先级队列
一种用来维护一组元素构成的集合S的数据结构,其中每个元素有一个关键字key。
支持的操作:
- INSERT(S, x),把元素x插入集合S中
- MAXINUM(S),返回S中具有最大键字的元素
- EXTRACT-MAX(S),去掉并返回S中具有最大键字的元素
- INCREASE-KEYS(S, x, k),将元素x的关键字增加到k(比原来大)