一、时间复杂度
O(nlgn),原地排序算法(需要的额外存储空间为常数);
二、堆
1.堆的性质
(1)大顶堆:除了根节点之外的每个节点满足:A[parent(i)]>=A[i](最大元素在根节点)
(2)小顶堆:除了根节点之外的每个节点满足:A[parent(i)]<=A[i](最小元素在根节点)
2.堆排序基本过程
(1)MAX-HEAPIFY
- 输入数组A和下标i,设LEFT(i)和RIGHT(i)均为大顶堆,调整A[i],使其成为大顶堆;
- 时间复杂度为O(lgn),高度为n的节点的运行时间复杂度为O(h)
(2)BUILD-MAX-HEAP
- 自底向上调用MAX-HEAPIFY建立最大堆,由于[n/2+1,n]元素均为叶子节点,因此只需要调整[n/2,0]元素;
- 时间复杂度为O(n)
(3)HEAPSORT
- 一次调用BUILD-MAX-HEAP,n-1次调用MAX-HEAPIFY(A, 1)(注:heap_size是不断递减的)
- 时间复杂度为O(nlgn)
3.优先级队列操作(堆可以在O(lgn)时间复杂度上支持大小为n集合上的任意优先级队列操作)
优先级队列是一种用来维护由一组元素构成的集合S的数据结构,这一组元素中的每一个都有一个关键字key,最大优先级队列支持的操作如下:
(1)MAX-HEAP-INSERT(S,x)
- 将元素x插入到集合S;
- ①加入一个关键字值为负无穷大的叶节点来扩充最大堆;②调用HEAP-INCREASE-KEY来设置新节点关键字的正确值,并保持最大堆性质;
- 时间复杂度为O(lgn)
(2)HEAP-EXTRACT-MAX(S)
- 去掉并返回S中具有最大关键字的元素
- 时间复杂度为O(lgn)
(3)HEAP-INCREASE-KEY(S,x,k)
- 将元素x的关键字的值增加到k,这里k值不能小于x的原关键字的值;
- A[i]不断和A[parent(i)]比较、交换,直到A[i]<=A[parent(i)]
- 时间复杂度为O(lgn)
(4)HEAP-MAXIMUM(S)
- 返回S中具有最大关键字的元素;return S[1];
- 时间复杂度为O(1)