数据结构堆排序中堆的建立、调整、插入、删除等操作的详解(题目讲解 简单易懂)

简介: 数据结构堆排序中堆的建立、调整、插入、删除等操作的详解(题目讲解 简单易懂)

堆的定义

首先我们要明确堆是个什么东西,简而言之堆就是一个具有特殊性质的完全二叉树

完全二叉树:一棵深度为k的有n个结点的二叉树,对树中的结点按从上至下、从左到右的顺序进行编号,如果编号为i(1≤i≤n)的结点与满二叉树中编号为i的结点在二叉树中的位置相同,则这棵二叉树称为完全二叉树

堆的特殊性质体现在结点与子结点的大小关系上,当父结点的值大于等于其子节点的值时候就是大根堆,反之就是小根堆

堆的操作

在堆的数据结构中,堆中的最大值总是位于根节点(在优先队列中使用堆的话堆中的最小值位于根节点)。堆中定义以下几种操作:

最大堆调整(Max Heapify):将堆的末端子节点作调整,使得子节点永远小于父节点

创建最大堆(Build Max Heap):将堆中的所有数据重新排序

堆排序(HeapSort):移除位在第一个数据的根节点,并做最大堆调整的递归运算

下面我们主要以题目手工建堆以及进行插入删除等操作进行调整,这也是历年408常考的题型之一

堆的插入

插入操作比较简单,把插入关键字插入到堆的空叶子结点中,然后依据大根堆或者小根堆的性质进行结点之间的调整即可

题目:已知关键字序列5,8,12,19,28,20,15,22为小根堆,插入关键字3,调整好之后得到的小根堆是?

这种题目我们先画出原本的小根堆,注意这里结点序号的对应为父结点为i,则左孩子为2i,右孩子为2i+1

堆的删除

堆的删除稍微复杂一些,堆删除一般指取根结点,这样实际上删除了序列中的最大值/最小值,这时我们用堆中最后一个元素插入根结点,然后再依据大根堆或者小根堆的性质调整即可

题目:对关键字序列23,17,72,60,25,8,68,71,52进行最小堆排序,输出两个最小关键字之后的剩余堆是?

先建立堆,然后每次输出/删除之后用最后一个结点补上再调整即可

空堆建立

下面我们就以2021年408中真题进行讲解

题目:将关键字6,9,1,5,8,4,7依次插入到初始为空的大根堆H中,得到的H是什么?

做题方法:按上面插入的方法,依次插入到叶子结点,有不符合性质的马上调整即可

堆的调整

有了上面的基础之后,堆的调整就十分好理解,堆的调整是指一个原本的堆经过调整之后形成大根堆或者小根堆,注意根上面空堆的插入建立区别开

题目:将序列6,1,5,9,8,4,7建成大根堆时,正确的序列变化过程为?

解题方法:先写出初始堆,这时一般它是不满足大根堆或者小根堆的性质,然后从序列末尾进行调整即可,调整完一轮后再往下看有没有需要调整的,直到符合大根堆或者小根堆的性质即可

创作不易 觉得有帮助请点赞关注收藏~~~

相关文章
|
2月前
|
存储 算法
【数据结构入门指南】二叉树顺序结构: 堆及实现(全程配图,非常经典)
【数据结构入门指南】二叉树顺序结构: 堆及实现(全程配图,非常经典)
32 0
|
存储 算法
【堆】数据结构堆的实现(万字详解)
【堆】数据结构堆的实现(万字详解)
|
存储 机器学习/深度学习 大数据
数据结构——堆
数据结构——堆
30 0
|
存储 机器学习/深度学习
数据结构--二叉树-堆(1)
数据结构--二叉树-堆(1)
数据结构--二叉树-堆(1)
|
14天前
|
算法
堆排序+TopK问题——“数据结构与算法”
堆排序+TopK问题——“数据结构与算法”
|
25天前
|
存储 算法
【算法与数据结构】深入解析二叉树(二)之堆结构实现
【算法与数据结构】深入解析二叉树(二)之堆结构实现
|
2月前
|
存储 算法
【数据结构】什么是堆?
【数据结构】什么是堆?
19 0
【数据结构】什么是堆?
|
2月前
|
存储 NoSQL Java
Redis 数据结构操作入门
Redis 数据结构操作入门
16 0
|
2月前
|
算法 搜索推荐
数据结构第十二弹---堆的应用
数据结构第十二弹---堆的应用
|
2月前
|
存储 算法 C++
数据结构第十一弹---堆
数据结构第十一弹---堆