IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 6.4-堆排序算法/6.5-优先队列 -> 正文阅读

[数据结构与算法]6.4-堆排序算法/6.5-优先队列

6.4 堆排序算法

1、如何实现堆排序?

(1)观察:BUILD-MAX-HEAP将输入数组A[1…n]建成最大堆,其中n=A.length,根结点A[1]必定是最大的元素。
(2)过程:我们只要将A[1]和A[n]互换,然后将A[n]排出这棵树(通过n–来实现),再将剩余元素组成的新的树通过MAX-HEAPIFY重新构建成一个最大堆。
(3)后续:不断(2)过程即可。

2、伪代码

HEAPSORT(A)
1 BUILD-MAX-HEAP(A)						//将数组转换为最大堆
2 for i = A.length downto 2 			
3 		exchange A[1] with A[i]			//将A[1]和A[i]交换
4		A.heap-size = A.heap-size - 1	//减小A.heap-size
5 		MAX-HEAPIFY(A,1)				//调用该函数使剩余元素依旧组成最大堆

3、案例

在这里插入图片描述
图1 描述了HEAPSORT(A)的工作过程:
(a)执行第一行BUILD-MAX-HEAP(A),产生一个最大堆。
(b)~(j)每次执行后续几行,将最大的数字(黑色阴影)排出,并将剩余部分(浅色阴影)重新整合为最大堆,标识当前的i。
(k)最终数组A的排序结果。

6.5 优先队列

一、引入

这里介绍堆的一个常见的应用:作为优先队列。

二、概念相关

1、概念:优先队列是一种用来维护由一组元素构成的集合S的数据结构,其中每一个元素都有一个相关的值,称为关键字
2、一个最大优先队列支持的操作:
(1)INSERT(S,X):把元素X插入到集合S中。
(2)MAXIMUM(S):返回S中具有最大关键字的元素。
(3)EXTRACT-MAX(S):去掉并返回S中的具有最大关键字的元素。
INCREASE-KEY(S,x,k):把元素x的关键字值增加到k,这里假设k的值不小于x的关键字值。
最小优先队列则类似

三、案例

1、通过HEAP-MAXIMUM来实现MAXIMUM操作,在θ(1)的时间内。

HEAP-MAXIMUM(A)
1 return A[1]

2、通过HEAP-EXTRACT-MAX实现EXTRACT-MAX操作:

HEAP-EXTRACT-MAX
1 if A.heap-size < 1				//验证队列里是否还有元素
2 	error "heap underflow"
3 max = A[1]						//引入变量max记录A[1]的值
4 A[1] = A[A.heap-size]				//将A[n]赋值给A[1]
5 A.heap-size = A.heap-size - 1		//将n--	
6 MAX-HEAPIFY(A,1)					//将剩余部分恢复为最大堆
7 return max						//返回最大值

这个过程时间复杂度为O(lg n),因为除了时间复杂度为O(lg n)的MAX-HEAPIFY操作之外,其他操作都只需花常数阶的时间。

3、通过HEAP-INCREASE-KEY实现INCREASE-KEY操作:

(1)伪代码:

HEAP-INCREASE-KEY(A,i,key)
1 if key < A[i]	//判断key是否小于A[i],小于就没法进行INCREASE操作
2		error "new key is smaller than current key"
3 A[i] = key	
//如果A[i]大于父结点,那么就要将其与父结点交换值以满足最大堆性质
4 while i > 1 and A[PARENT(i)] < A[i]	
5 		exchange A[i] with A[PARENT(i)]
6 		i = PARENT(i)

这个过程的时间复杂度为O(lg n),因为在算法第3~6行中类似MAX-HEPIFY的操作需要该时间。
(2)案例:
在这里插入图片描述
(a)图中为最大堆,下标i结点用深色阴影显示。
(b)将该关键字增加到15。
(c)经过一次4~6行的迭代,i与父结点交换位置。
(d)经过再一次迭代,使得整棵树满足最大堆性质,程序结束。

4、通过MAX-HEAP-INSERT实现INSERT操作

MAX-HEAP-INSERT(A,key)
1 A.heap-size = A.heap-size + 1	//增加一个-∞的叶结点来扩大最大堆
2 A[A.heap-size] = -∞	
//通过调用HEAP-INCREASE-KEY来为新结点设置对应的关键字,同时保持最大堆的性质
3 HEAP-INCREASE-KEY(A,A.heap-size,key)

在包含n个元素的堆上,MAX-HEAP-INSERT的运行时间为O(lg n)。

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-08-06 11:07:37  更:2022-08-06 11:11:27 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/21 2:24:03-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码