每天一点算法-堆(Day9)

简介: 每天一点算法-堆(Day9)

上一篇介绍了完全二叉树,今天介绍的就是一颗完全二叉树,但要被放到数组里做实现。

最大堆、最小堆

最小堆(小根堆):所有父结点小于子结点的堆。

最大堆(大根堆):所有父结点大于子结点的堆。

堆操作

的操作一般有以下基本操作:上浮(子结点与其父结点互换位置)、下沉(父结点与其子结点互换位置)、插入pop(删除最大堆中的最大值或者最小堆中的最小值)等。为了实现这些,需要给结点按顺序定一个下标,并用数组来存放。即:

若某结点的下标为 i, 则其 左儿子的下标为 2*i+1右儿子的下标为 2*i+2

以下是一个小根堆存放数组示例:

下面介绍两个比较重要的操作——插入pop

插入

不破坏原的规则的情况下插入一个结点。以上面的小根堆为例,现在尝试插入一个结点"27":
插入操作流程

pop

pop操作第一步是把根结点删除,没了根就不能是堆了,于是可以先把最后一个结点充当根(若是以其他结点补充到根会使还原堆的规则更复杂),接下来要做的就是还原最大堆和最小堆的特性(父子结点关系),以小根堆为例的流程:

1.删除原有根;

2.最后一个结点充当根,值记做M;

3.M与其左右子结点中,若两个子节点都大于M,则完成还原,退出流程;若有子结点大于M,则取大于M中的左右子节点中最大的一个与M互换;

4.M重复第3步直到完成还原或者M已经是叶节点。

图示(画图软件很费时间,手画吧,字丑了点请见谅):
pop操作

相关文章
|
8月前
|
搜索推荐 算法
插入,选择,堆,快速排序算法思想与复杂度
1.从第一个元素开始,将其视为已排序部分 2.取出下一个元素,在已排序部分从后向前进行比较,找到合适的位置并插入 3.重复上述步骤,直到所有元素都被插入到已排序部分。
42 1
|
3天前
|
Arthas 监控 算法
JVM工作原理与实战(二十五):堆的垃圾回收-垃圾回收算法
JVM作为Java程序的运行环境,其负责解释和执行字节码,管理内存,确保安全,支持多线程和提供性能监控工具,以及确保程序的跨平台运行。本文主要介绍了垃圾回收算法评价标准、标记清除算法、复制算法、标记整理算法、分代垃圾回收算法等内容。
22 0
JVM工作原理与实战(二十五):堆的垃圾回收-垃圾回收算法
|
3天前
|
算法 PHP
堆——“数据结构与算法”
堆——“数据结构与算法”
|
3天前
|
算法 测试技术 C#
【广度优先搜索】【堆】【C++算法】407. 接雨水 II
【广度优先搜索】【堆】【C++算法】407. 接雨水 II
|
3天前
|
存储 算法
【算法与数据结构】深入解析二叉树(二)之堆结构实现
【算法与数据结构】深入解析二叉树(二)之堆结构实现
|
3天前
|
存储 算法 搜索推荐
【算法】七大经典排序(插入,选择,冒泡,希尔,堆,快速,归并)(含可视化算法动图,清晰易懂,零基础入门)
【算法】七大经典排序(插入,选择,冒泡,希尔,堆,快速,归并)(含可视化算法动图,清晰易懂,零基础入门)
|
6月前
|
搜索推荐 Java
排序算法-冒泡、选择、堆、插入、归并、快速、希尔
排序算法-冒泡、选择、堆、插入、归并、快速、希尔
15 0
|
7月前
|
存储 算法 C语言
二叉树的概念和性质/向上调整、向下调整算法/堆的插入和删除/堆排序/Top-K问题【上】【数据结构/二叉树/初阶/C语言实现】
二叉树的概念和性质/向上调整、向下调整算法/堆的插入和删除/堆排序/Top-K问题【上】【数据结构/二叉树/初阶/C语言实现】
27 0
|
7月前
|
算法
带你读《图解算法小抄》八、堆(1)
带你读《图解算法小抄》八、堆(1)
带你读《图解算法小抄》八、堆(1)
|
存储 算法
【数据结构初阶】第七篇——二叉树的顺序结构及实现(堆的向下,向上调整算法)
【数据结构初阶】第七篇——二叉树的顺序结构及实现(堆的向下,向上调整算法)
【数据结构初阶】第七篇——二叉树的顺序结构及实现(堆的向下,向上调整算法)