算法导论学习笔记-第六章-堆排序
来源:互联网 发布:电脑硬件检测软件 编辑:程序博客网 时间: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++实现
- 算法导论学习笔记-第六章-堆排序
- 《算法导论》学习笔记--第六章 堆排序
- 算法导论 学习笔记 第六章 堆排序
- 《算法导论》第六章 堆排序 笔记
- 算法导论: 第六章 堆排序算法
- 学习《算法导论》第六章 堆排序 总结
- 学习《算法导论》第六章 堆排序 总结二
- 算法导论读书笔记 第六章 堆排序
- 算法导论第六章:堆排序
- 算法导论第六章 堆排序总结
- 算法导论第六章 堆排序
- 算法导论 第六章 堆排序
- 【算法导论】第六章之堆排序
- 算法导论第六章 堆排序
- 堆排序(算法导论第六章)
- [算法导论]第六章《堆排序》
- 算法导论第六章堆排序思考题
- 算法导论第六章 堆排序
- Hibernate中Criteria的完整用法
- MFC全局函数::AfxBeginThread
- php学习心得(适合php初学者)
- 错误的结果2......VC/bin/cl.exe返回的最终解决方案
- jsForm - Html Form via JSON with jQuery
- 算法导论学习笔记-第六章-堆排序
- redhat下Mplayer的安装
- J2EE项目统一编码(UTF-8)
- 第一篇CSDN文章
- JAVA学习计划1
- 美国人竟然是这样教育小学生
- HDC,CDC,CClientDC,CPaintDC,CWindowDC的区别
- C++操作符重载
- 一些智力题集锦