堆的相关知识

来源:互联网 发布:911segg.info新域名 编辑:程序博客网 时间:2024/06/05 05:15

我们知道在一个堆中满足任意子树的根大于其儿女则,这个堆为最大堆,反之亦然,为最小堆。

我们也有如下几个较为重要的性质:

(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)

0 0
原创粉丝点击