算法导论学习笔记-第六章-堆排序

来源:互联网 发布:电脑硬件检测软件 编辑:程序博客网 时间:2024/05/16 18:41

第六章 堆排序

 

总结:这章主要讲了堆、建堆、堆排序、优先级队列等。

 

1.   

堆可以被视为一颗完全二叉树,底层用数组实现。

length[A]: 数组中的元素个数

heap-size[A]: 存放在A中的堆的元素个数

树的根A[1]

给定某个结点的下标i:

父节点PARENT(i)=[i/2]

左节点LEFT(i)=2i

右节点RIGHT(i)=2i+1

最大堆:A[PARENT(i)] >= A[i]

最小堆A[PARENT(i)] <= A[i]

 

2.    保持堆的性质

MAX-HEAPIFY(A, i)

输入数组A,下标i,假设以LEFT(i)RIGHT(i)为根的两颗二叉树都是最大堆,要使以A[i]为根的二叉树也是最大堆。

分析:复杂度O(lgn)

 

伪代码

MAX-HEAPIFY(A, i)

l <- LEFT(i)

r <- RIGHT(i)

largest <- i

if l<=heap-size[A] and A[l]>A[largest]

      then largest <- l

if r<=heap-zise[A] and A[r]>A[largest]

      then largest <- r

if largest != i

      then exchange A[i] <-> A[largest]

           MAX-HEAPIFY(A, largest)

 

3.    建堆

BUILD-MAX-HEAP(A)

将数组A变为最大化堆

自底向上建堆,子数组A[(n/2)+1, …, n]中的元素都是树中的叶子

分析:复杂度O(n)

 

伪代码

BUILD-MAX-HEAP(A)

heap-size[A] <- length[A]

for i <- (length[A]/2) downto 1

       MAX-HEAPIFY(A, i)

 

4.    堆排序算法HEAPSORT(A)

A进行排序,从小到大输出

分析:O(nlgn)

 

伪代码

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)

 

5.    优先队列

可以用堆实现

 

1)       HEAP-MAXIMUM(A)

返回A中的最大值

分析:O(1)

 

伪代码

HEAP-MAXIMUM(A)

return A[1]

 

2)       HEAP-EXTRACT-MAX(A)

去掉A中的最大值

分析:O(lgn)

 

伪代码

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

 

3)       HEAP-INCREASE-KEY(A, i, key)

A[i]的值增加为key,人要保持最大堆的特性

分析:O(lgn)

 

伪代码

HEAP-INCREASE-KEY(A, i, key)

if key < A[i]

      then error “new key is smaller than the current key”

A[i] <- key

while i>1 and key > A[PARENT(i)]

      do exchange A[i] <-> A[PARENT(i)]

           i <- PARENT(i)

 

4)       MAX-HEAP-INSERT(A, key)

key插入到A

分析:O(lgn)

 

伪代码

MAX-HEAP-INSERT(A, key)

heap-size[A] <- heap-size[A]+1

A[heap-size[A]] <- 负无穷大

HEAP-INCREASE-KEY(A,heap-size[A],key)

最大堆的C++实现

原创粉丝点击