最大堆:通常用于堆排序;A[parent(i)] >= A[i]
最小堆:通过用于构造优先队列
一个数组A表示堆,A[i]的左孩子为A[2i],右孩子为A[2i+1]
1. MAX-HEAPIFY
【维持堆性质】:给定一个数组A和下标i,假定节点i的左子树和右子树都满足最大堆性质,但是i可能不满足;
通过让A[i]的值在堆中逐级下降,使得数组回到满足最大堆性质的过程
主要思路:每次找到A[i]、A[left]、A[right]中最大的值,如果A[i]是最大值,则过程结束;否则将最大值与A[i]调用,递归调用该过程
时间复杂度分析,调整A[i]与最大值的位置代价为O(1),因为该过程是递归调用的,而一个节点的子树至多为上一层树的2/3,因此
T(n) = T(2n/3) + O(1),从而时间复杂度是O(lg n)
2. BUILD-MAX-HEAP
【建堆】:
对于数组A,长度为n
先构造一个堆结构,再从A[n/2]到1,对堆进行MAX-HEAPIFY这个过程
时间复杂度分析,每次调用MAX-HEAPIFY过程需要O(lg n),需要调用n/2次,因此上界为O(nlg n)
然而,因为每个节点调用MAX-HEAPIFY的时间复杂度只与以它为根的子树高度有关,因此可以退出时间复杂度为O(n)
3. HEAPSORT
【堆排序】:
已经建好的堆中,A[1]总是最大节点,将其与A[n]交换,从而可以截掉A[n],再调用MAX-HEAPIFY维持堆结构
递归调用以上过程,即可得到有序数组
时间复杂度分析:建堆一次【O(n)】,n-1次MAX-HEAPIFY【O(n lg n)】;因此总复杂度为
【O(n lg n)】