我们知道在一个堆中满足任意子树的根大于其儿女则,这个堆为最大堆,反之亦然,为最小堆。
我们也有如下几个较为重要的性质:
(1):一个堆中至多有2^(n+1) -1个节点,至少有2^n个节点。
(2):设堆A有n个节点,则其叶节点下标为⌊(n/2)⌋+1,⌊(n/2)+2⌋,⌊(n/2)+3⌋,……,n。
(3):设MAX-HEAPIFY(i)过程可使以第i个节点为根的子树成为最大堆。
(4):当对(n/2)+1以后的节点进行MAX-HEAPIFY过程不会产生影响。
(5):MAX-HEAPIFY过程时间复杂度为O(lgn)。因为lgn=h,最多只递归h次。
(6):节点高度(height of node)从在该节点下的最低的叶子向上,该节点所在的层数。
(7):节点深度(depth of node) 从根节点向下,经过的层数。
(8):在任一有n个元素的堆中,最多有⌊(n/2^(h+1))⌋个高度为h的节点(不是深度)。
现在我们讲一下如何建最大堆,过程——BUILD-MAX-HEAP(A)
我们需要将一个数组A[1..n]变成一个最大堆。我们需要对其所有非叶子节点进行MAX-HEAPIFY过程。所以我们只需从⌊n/2⌋至1去递归过程即可。
现讲一下堆排序的算法(从大到小):
其实就是先把堆变成最大堆,然后再取出首元素,然后再把第n个元素与第1个元素调换,并调用MAX_HEAPIFY(1)使得当前以第一个元素为根的子堆依然满足最大堆性质,从而导致整个堆满足,以保证下次调换的正确性,整个过程的时间复杂度约为O(nlgn)