博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
堆的实现(图片演示+文字讲解)
阅读量:5927 次
发布时间:2019-06-19

本文共 800 字,大约阅读时间需要 2 分钟。

堆的实现

虽然我们之前的介绍堆的时候是一个二叉树,但是我们实现堆的时候并不是按照传统的二叉树实现(传统的二叉树是用链的形式,即一个父节点存放两个子节点的引用)

为什么要这样说呢?

我们先看一下堆的结构:

 

如果我们观察每一个节点的顺序,我们会发现一个有趣的规律:

对于任意个下标a的元素,他的左孩子下标是2*a,右孩子下标是2*a+1,父节点下标是a/2取整。

而堆又有分层添加(一层添加完才需要添加下一层)的特性,所以用数组来实现堆,才是一个最佳的选择。

那么如果是一个数组,堆的插入和取值如何实现呢?

插入:

上图的堆如果转换成数组就是下面这样,红色为数组下标:

 

当要进行插入操作时,堆会把新值放到堆的最后,对数组来说就是数组的最后啦~实现起来很简单!

 

然后,我们需要判断是否满足条件:父元素比子元素小(我们按最小堆来解释)。

3的下标是11,那么根据上面的公式:每个节点的父节点下标是此节点下标/2取整,那么他的父元素就是下标11/2=5,下标5对于的数字是7

由于7>3,所以需要替换

 

再次比较3的父节点(5/2=2,即第2个元素6),发现比父节点小,依然替换

 

再次按上述规则比较,发现符合条件,插入完成!

取最小数:

由之前的可以知道,取最小数就是取第一个数,然后把最后一个数放到第一个数的位置,如下图所示:

 

然后我们比较是否满足条件:父元素小于两个子元素

下标 1的两个子节点下标分别为分别21*2)和31*2+1),对应值64

下标1的对应值为11,大于4,不满足条件,所以替换

 

再次比较是否满足条件:

下标3的两个子节点下标为63*2)和73*2+1),对应值65

下标3对应值为11,大于5,不满足条件,所以替换

 

再次按上述规则比较,发现满足条件,至此,取最小值完成;

转载于:https://www.cnblogs.com/chenkeyu/p/7505704.html

你可能感兴趣的文章
数据初始化
查看>>
把C#.NET程序移植到DB2上的经验浅谈(C#连接DB2可以用IBM.Data.DB2.dll)
查看>>
linux第二课
查看>>
文件管理、命令别名和glob
查看>>
游戏服务器注意事项
查看>>
MapReduce经典案例——统计单词数
查看>>
Mysql-高可用集群[MyCat中间件使用](三)
查看>>
中项笔记(四)
查看>>
iOS开发  plist字段列表,很全
查看>>
常见的http状态码
查看>>
思科路由PPPOE基本配置
查看>>
操作分布式文件之三:如何访问和操作远程文件
查看>>
zookeeper的单实例和伪集群部署
查看>>
【MAC】Ncnn 编译so文件方案
查看>>
mybatis 取传进来的参数 mybatis #{ } ${ }区别是啥?
查看>>
linux下A免密码登录B
查看>>
Windows Server 2012活动目录基础配置与应用(新手教程)之3---将客户机加入到指定域...
查看>>
将虚拟机转换成模板
查看>>
今天正式开通51CTO技术博客
查看>>
《Ext JS权威指南》印出来了,大家很快就能拿到书了
查看>>