1 维护最大堆性质的过程(MAX-HEAPIFY)
输入数组A和一个下标i。假设以LEFT(i)和RIGHT(i)为根节点二叉树都是最大堆,但是A[i]可能小于左右孩子节点。这时需要通过该过程使得A[i]在最大堆中“逐级下降”,从而使得以下标i为根节点二叉树为最大堆。
伪代码 :
MAX-HEAPIFY(A , i)
L = LEFT(i) = 2i ;
R = RIGHT(i) = 2i+1;
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 )
max = A[largest];
A[largest]= A[i];
A[i] = max;
MAX-HEAPIFY(A , largest)
2 构建一个最大堆过程(BUILD-MAX-HEAP)
利用过程(MAX-HEAPIFY)把一个大小为n = A.length 的数组 A[1,...,n] 转化为最大堆。根据树的结构特点,子数组A(↓(n/2),...,n)中的元素都是树的叶节点 。每个叶节点都可以看成只包含一个元素的堆。过程BUILD-MAX-HEAP对树中非叶节点都调用一次过程(MAX-HEAPIFY)
BUILD-MAX-HEAP(A)
A.heap-size = A.length;
for(i = ↓A.length/2; i >= 1; i--) {
MAX-HEAPIFY(A , i) ;
}
3 堆排序过程
利用BUILD-MAX-HEAP将输入数组A[1,...,n]建成最大堆。数组最大元素A[1],交换A[1]与A[n],再通过A.heap-size-1来去掉节点n,再调用MAX-HEAPIFY来维护最大堆。不断重复该过程,直到堆的大小到2
伪代码:
HEAPSORT(A)
BUILD-MAX-HEAP(A)
for(i = A.lenght; i >=2; i++) {
max = A[1];
A[1] = A[i];
A[i] = max;
A.heap-size = A.heap-size -1;
MAX-HEAPIFY(A , 1);
}
堆排序的时间复杂度Θ(nlgn)
原文地址:https://www.cnblogs.com/zhang-feng/p/12010030.html