搜索
查看
编辑修改
首页
UNITY
NODEJS
PYTHON
AI
GIT
PHP
GO
CEF3
JAVA
HTML
CSS
搜索
知新_RL
这个屌丝很懒,什么也没留下!
关注作者
热门标签
jquery
HTML
CSS
PHP
ASP
PYTHON
GO
AI
C
C++
C#
PHOTOSHOP
UNITY
iOS
android
vue
xml
爬虫
SEO
LINUX
WINDOWS
JAVA
MFC
CEF3
CAD
NODEJS
GIT
Pyppeteer
article
热门文章
1
Android Studio音乐播放器(使用sqlite创建数据库)_音乐播放器android studio
2
Java NIO编程实例_java nio编程案例
3
全网首发亲测有用:python免费将chatgpt机器人接入个人微信(同时支持钉钉、QQ 以及别的语言模型如文心一言等)_chatgpt怎么接入微信
4
逻辑回归——牛顿法矩阵实现方式
5
[ELK实战] Elasticsearch 聚合查询二: Bucketing/桶聚合_elk es查询时间查询
6
辅警考试怎么搜题答案?八个受欢迎的搜题分享了 #学习方法#学习方法#媒体_千鸟搜题
7
最优化算法之粒子群算法PSO_粒子群算法是谁提出的
8
H3C SSH远程登录配置_h3c ssh配置
9
第23篇 Android Studio第一个程序HelloWorld_android studio 4.2.2 helloworld
10
Ubuntu20.04安装微信等软件全过程_ubantu20.04 安装微信
当前位置:
article
> 正文
如何建堆
作者:知新_RL | 2024-06-18 07:15:31
赞
踩
将一个序列建堆
今天来了解一下堆排序的问题,“堆”是个很有趣的结构。通常“堆”是通过数组来实现的,这样可以利用数组的特点快速定位指定索引的元素。而对“堆”的操作中定位某个元素简直就是家常便饭。为什么这么说呢,我们来看看“堆”的定义:
在起始索引为 0 的“堆”中:
1) 堆的根节点将存放在位置 0
2) 节点 i 的左子节点在位置 2 * i + 1
3) 节点 i 的右子节点在位置 2 * i + 2
4) 节点 i 的父节点在位置 floor( (i - 1) / 2 ) : 注 floor 表示“取整”操作
在起始索引为 1 的“堆”中:
1) 堆的根节点将存放在位置 1
2) 节点 i 的左子节点在位置 2 * i
3) 节点 i 的右子节点在位置 2 * i + 1
4) 节点 i 的父节点在位置 floor( i / 2 ) : 注 floor 表示“取整”操作
以下是一个“堆”的图例:
[img]http://dl.iteye.com/upload/attachment/251138/abe0f3b2-4990-3791-bef4-88517c9af9f2.bmp[/img]
因此,当我们得知某个节点的索引为 i 时,可以通过以下“堆”的定义很容易地定位到它的子节点和父节点。
不仅如此,“堆”还有个特性:每个节点的键值一定总是大于(或小于)它的父节点。如果我们修改了某个节点的键值,这样就会破坏“堆”的这个特性,因此这时我们就要根据该节点的新键值与它的父节点和子节点的键值进行比较,对该节点进行“上移”或者“下移”操作,使之能够重新放置到合适位置。
这里我们了解一下“堆”的这两个很重要的操作:“上移”和“下移”。
这里我们假设这是一个“最大堆”,即“堆”的根节点保存的是键值最大的节点。即“堆”中每个节点的键值都总是大于它的子节点。
当某节点的键值大于它的父节点时,这时我们就要进行“上移”操作,即我们把该节点移动到它的父节点的位置,而让它的父节点到它的位置上,然后我们继续判断该节点,直到该节点不再大于它的父节点为止才停止“上移”。
现在我们再来了解一下“下移”操作。当我们把某节点的键值改小了之后,我们就要对其进行“下移”操作。首先,我们要取该节点的两个左右子节点中键值较大的一个,与该节点进行比较,如果该节点小于它的这个子节点,就把该节点移动到它的子节点的位置,而让它原来的子节点升到它的位置上。然后我们继续判断该节点,直到该节点不再小于它的左右子节点为止才停止“下移”。
现在我们再来看看如何把一个无序的序列建立成为一个“堆”?
根据“堆”的特性,我们可以从无序序列的最后一个节点的父节点开始,对其进行“下移”操作,直到序列的第一个节点为止。这样就可以保证每个节点都在合适的位置上,也就建立起了一个“堆”。
但是“堆”并不是一个完全排序的序列,因为“堆”只保证了父节点与子节点的位置关系,但并不保证左右子节点的位置关系。那么我们如何进行“堆排序”呢?
由于一个“堆”的根节点必然是整个序列中最大的元素,因此对于一个排序的序列而言,每个“堆”中我们只能得到一个有效的元素。如果我们拿掉根节点,再对剩下的序列重新排列组成一个“堆”,反复如此,我们就可以依次得到一个完整的排序序列了。
当然,为了简化操作,每次我们只需要把根节点与最后一个位置的节点交换,然后把最后一个位置排除之外,对根节点进行“下移”操作即可。
声明:
本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:
https://www.wpsshop.cn/w/知新_RL/article/detail/734162
推荐阅读
article
【
数据结构
与
算法
】十大经典
排序
算法
图文详解及Python代码
实现
_
python
实现
选择
排序
数据结构
与...
十大经典
排序
算法
图文详解及
python
代码
实现
_
python
实现
选择
排序
数据结构
与
算法
ctionsort
(
list
): ...
赞
踩
article
数据结构
与
算法
—
动态
规划
算法
_
动态
规划
算法
数据结构
里...
数据结构
与
算法
—
动态
规划
算法
_
动态
规划
算法
数据结构
里
动态
规划
算法
数据结构
里 ...
赞
踩
article
【
数据结构
与
算法
】
堆排序
(
向下
和
向上
调整
)、
TOP
-K问题(超详细解读)_
堆排序
删除
调整
...
C
数据结构
的
堆排序
,包含了
向上
调整
以及
向下
调整
的知识点,还有Top-K问题。_
堆排序
删除
调整
堆排序
删除
调整
...
赞
踩
article
数据
结构
与
算法
-
树
(
树
森林
树
的三种储存
结构
)_
数据
结构
树
与
森林
使用场景...
小孱弱弱又来了,终于到
树
了,等不及了,在这里,有众多以
树
为基础的
数据
结构
和
算法
,绝对能令你们折服,这精妙的
算法
,注定令人...
赞
踩
article
【
数据结构
与
算法
】(一)
时间
复杂度
分析
、空间
复杂度
分析
、最好
复杂度
、最坏
复杂度
、平均
复杂度
、均摊
时间
...
数据结构
与
算法
:
数据结构
:存储数据的结构
算法
:操作数据衡量
算法
操作数据的效率可以通过实际的运行来得到一次大致的结果,...
赞
踩
article
数据结构
与
算法
--
算法
复杂度
_
算法
复杂度
的
数量级
...
文章目录前言一、
算法
复杂度
1. T(n)= O(F(n))2.
复杂度
分析法则3.时间
复杂度
分析4.常见时间
复杂度
实例分析...
赞
踩
article
【
数据结构
与
算
法】时空
复杂度
的
计
算
_时空
复杂度
怎么
算
...
数据结构
(DataStructure)是计
算
机存储、组织数据
的
方式,指相互之间存在一种或多种特定关系
的
数据元素
的
集合。简...
赞
踩
article
【
数据结构
与
算法
】
算法
的
空间
复杂度
和时间
复杂度
的
计算_求解
问题
的
一系列
步骤
的
集合...
一、上什么是
算法
?1、
算法
就是求解
问题
的
一系列
步骤
的
集合。2、通常把具体存储结构上
的
操作实现步骤或过程称为
算法
。二、
算法
...
赞
踩
article
1
.
复杂度
[
数据结构
与
算法
]...
文章目录什么是
数据结构
什么是
算法
重要性
复杂度
算法
效率时间
复杂度
概念大O的渐进表示法练习[面试题
1
7.04. 消失的数字...
赞
踩
article
《
C#
数据结构
与
算法
》
--
2020 最新精讲版:3-5
时间
复杂度
分析
_c#
数据结构
时间
复杂度
...
目录一.目的1.想:将B站视频《
C#
数据结构
与
算法
》
--
2020 最新精讲版:提高学习效率,所以编写此系列博客2.因为这...
赞
踩
article
数据结构
与
算法
(七)(
哈希
表
)_参考
算法
7.10
,
建立
哈希
表
...
哈希
表
1.问题:有一个公司,每次来新的员工都要求将员工信息输入(id,name),并且可以遍历所有员工
,
要求不能使用数据...
赞
踩
article
数据
结构
与
算法
:
二叉
树专题_
如果
一棵
二叉
排序树各结点的
数据
均为整数...
Python、
数据
结构
与
算法
、栈、队列、
二叉
树、中序遍历、层次遍历_
如果
一棵
二叉
排序树各结点的
数据
均为整数
如果
一棵
二叉
排...
赞
踩
article
WebGL
2
.0从入门到精通-
2
、
数据结构
与算法(一、
动态化
类型
数组
的
封装
)...
动态化
类型
数组
的
封装
_webgl
2
webgl
2
二、
数据结构
与算法 一、
动态化
类型
数组
...
赞
踩
article
WebGL
2
.0从入门到精通-
2
、
数据结构
与算法(三、
双向
循环
链表
的
封装
)...
双向
循环
链表
的
封装
_webgl
2
.0webgl
2
.0 三、
双向
循环
链表
的
封装
JS/T...
赞
踩
article
数据结构
与
算法
--
八大
排序
_
排序
算法
总结表格...
1.基本概念:1.
排序
:2.需要掌握的点:3.稳定性:4.
排序
难点:2.分类:3.比较:1.稳定性:2.时间复杂度:3....
赞
踩
article
【
数据结构
与
算
法】
时间
复杂度
和
空间
复杂度
计
算
_408
数据结构
空间
复杂度
怎么
算
...
目录前言一、
时间
复杂度
和
空间
复杂度
是什么?1.
算
法效率2.
时间
复杂度
3.
空间
复杂度
的概念4.大O的渐进表示法二、如何计
算
...
赞
踩
article
【
数据结构
与算法】【
字符串
匹配
】
Trie
树
_
trie
实现
字符串
蛮力
匹配
...
一、 什么是“
Trie
树
”?1. 他是一种
树
形结构,是一种专门处理
字符串
匹配
的
数据结构
,解决在一组
字符串
集合中快速查找某...
赞
踩
相关标签
排序算法
算法
数据结构
动态规划
c++
c语言
笔记
开发语言
指针
链表
二叉树
数据结构与算法
复杂度分析
时间复杂度
空间复杂度
c#