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

堆的定义

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

完全二叉树:一棵深度为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建成大根堆时,正确的序列变化过程为?

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

showswoller

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值