您的位置:首页 > 其它

算法导论学习笔记——第6章 堆排序

2015-05-12 22:08 429 查看


堆数据结构是一种数组对象,可以被视为一棵完全二叉树。

对于给定的数组A,树的根为A[1],对于给定的下标为i的结点A[i],其父结点PARENT(i)=floor(i/2),左子结点LEFT(i)=2i,右子结点RIGHT(i)=2i+1

length[A]是数组中元素的个数,heap-size[A]是存放在数组A中,堆元素的个数

叶级结点的高度可以认为是0,每向上一层,高度加一,定义树的告诉为根结点的高度。

最大堆的性质

//非根结点的结点i,最多和其父结点的值一样大
A[PARENT(i)]>=A[i]


保持堆的性质

MAX-HEAPIFY(A,i)
l←LEFT(i)
r←RIGHT(i)
if l<=heap-size[A] and A[l]>A[i]
then largest←l
else largest←i
if r<=heap-size[A] and A[r]>A[largest]
then largest←r
if largest!=i
then exchange A[i]↔A[largest]
MAX-HEAPIFY(A,largest)


建堆

BUILD-MAX-HEAP(A)
heap-size[A]←length[A]
for i←floor(length[A]/2) downto 1
do MAX-HEAPIFY(A,i)


堆排序

HEAPSORT(A)
BUILD-MAX-HEAP(A)
for i←length[A] downto 2
do exchange A[1]↔A[i]
heap-size[A]←heap-size[A]-1
MAX-HEAPIFY(A,1)


最大优先级队列,支持以下操作

INSERT(S,x):把元素x插入集合S,S←S∪{x}

MAXIMUM(S):返回S中具有最大关键字的元素

EXTRACT-MAX(S):去除并返回S中具有最大关键字的元素

INCREASE-KEY(S,x,k):将元素x的关键字值增加到k,k不能小于x的原关键字值

HEAP-MAXIMUM(A)
 return A[1]

HEAP-EXTRACT-MAX(A)
 if heap-size[A]<1
then error "heap underflow"
max←A[1]
A[1]←A[heap-size[A]]
heap-size[A]←heap-size[A]-1
MAX-HEAPIFY(A,1)
return max

HEAP-INCREASE-KEY(A,i,key)
 if key<A[i]
then error "new key is smaller than current key"
A[i]←key
while i>1 and A[PARENT(i)]<A[i]
do exchange A[i]↔A[PARENT(i)]
i←PARENT(i)

MAX-HEAP-INSERT(A,key)
 heap-size[A]←heap-size[A]+1
A[heap-size[A]]←-∞
HEAP-INCREASE-KEY(A,heap-size[A],key)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: