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

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

堆的定义

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

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

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

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

相关文章
|
17天前
|
存储 JavaScript 前端开发
什么是堆?什么是栈?他们之间从区别和联系
什么是堆?什么是栈?他们之间从区别和联系
31 0
|
5天前
|
存储 程序员
什么是堆,什么是栈
什么是堆,什么是栈
6 0
|
7天前
【数据结构】二叉树-堆(top-k问题,堆排序,时间复杂度)
【数据结构】二叉树-堆(top-k问题,堆排序,时间复杂度)
16 4
|
7天前
【数据结构】二叉树-堆(函数实现)
【数据结构】二叉树-堆(函数实现)
12 2
|
21天前
|
存储 C语言
数据结构:8、堆
数据结构:8、堆
21 0
|
26天前
|
算法
堆排序+TopK问题——“数据结构与算法”
堆排序+TopK问题——“数据结构与算法”
|
26天前
|
算法 PHP
堆——“数据结构与算法”
堆——“数据结构与算法”
|
1月前
|
存储 机器学习/深度学习 算法
初阶数据结构之---堆的应用(堆排序和topk问题)
初阶数据结构之---堆的应用(堆排序和topk问题)
|
1月前
|
存储 算法
初阶数据结构之---二叉树的顺序结构-堆
初阶数据结构之---二叉树的顺序结构-堆
|
1月前
|
算法 搜索推荐 数据挖掘
【算法与数据结构】堆排序&&TOP-K问题
【算法与数据结构】堆排序&&TOP-K问题