
Data Structures in C++:堆和堆排序
将元素插入到堆的最后一个节点。 从该节点向上逐层移动,直到找到一个不大于当前节点值的父节点。 交换当前节点与父节点的值。
删除根节点的值。 将最后一个节点的值替换到根节点位置。 从根节点向下逐层移动,直到找到一个不小于左右子节点的值。 交换当前节点与左右子节点的值。
构造一个空的大顶堆。 将待排序序列中的元素按顺序推送到堆中。 重复从堆顶读取最大值并删除,直到堆为空。
发布日期:2021-05-17 15:29:45
浏览次数:22
分类:精选文章
本文共 1017 字,大约阅读时间需要 3 分钟。
堆数据结构
堆是一种基于完全二叉树的数据结构,具有以下特点:每个节点的值总是不大于或不小于其父节点的值。一棵深度为k且有n个结点的二叉树称为满二叉树,而深度为k且有n个结点的二叉树称为完全二叉树。
堆的分类
堆可分为大顶堆和小顶堆两种类型:
- 大顶堆:每个节点的值都大于或等于其子节点的值。
- 小顶堆:每个节点的值都小于或等于其子节点的值。
大顶堆和小顶堆都可用于从小到大或从大到小排序,通常选择大顶堆进行排序。
堆的代码实现
堆可以用数组来实现,数组元素对应树的节点索引。父子节点的索引关系如下:
- 索引为t的节点,其父节点索引为
(t - 1) / 2
。 - 索引为t的节点,其左孩子索引为
2t + 1
,右孩子索引为2t + 2
。
插入操作(push)
删除操作(pop)
堆排序
堆排序是一种选择排序算法,利用堆数据结构实现。其基本思想如下:
这种方法的时间复杂度为 O(n log n),是不稳定的排序算法。
C++11中的优先队列
在C++11中,priority_queue
是一种优先队列容器适配器,默认以最大值优先。其成员函数包括:
top()
:访问队头元素。empty()
:判断队列是否为空。size()
:返回队列元素个数。push()
:插入元素并排序。pop()
:删除队头元素。swap()
:交换队列内容。
优先队列的定义形式为:
priority_queue
其中:
Type
为数据类型,默认为大顶堆。Container
为容器类型(需支持数组操作,如vector
)。Functional
为比较函数,用于定义优先级规则。
小顶堆可通过传递 greater<Type>
比较函数定义。
总结
堆数据结构作为完全二叉树的应用,广泛用于排序、优先级队列等场景。其插入和删除操作通过对数组的直接操作实现,时间复杂度为 O(log n)。C++11中的 priority_queue
提供了便捷的优先队列接口,适用于多种应用场景。
发表评论
最新留言
网站不错 人气很旺了 加油
[***.192.178.218]2025年04月20日 13时35分31秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
JQuery--手风琴,留言板
2019-03-12
MFC 自定义消息发送字符串
2019-03-12
Linux操作系统的安装与使用
2019-03-12
C++ 继承 详解
2019-03-12
OSPF多区域
2019-03-12
Docker入门之-镜像(二)
2019-03-12
数据结构——链表(3)
2019-03-12
socket模块和粘包现象
2019-03-12
去了解拉绳位移编码器的影响因素
2019-03-12
无法初始化Winsock2.2处理
2019-03-12
vMotion 操作失败进度卡在14% ,报错: Operation Timed out
2019-03-12
重置UAG Application admin密码
2019-03-12
Horizon Daas租户管理平台扩展分配时报:内部错误
2019-03-12
项目计划甘特图绘制说明
2019-03-12
嵌入式系统试题库(CSU)
2019-03-12
图神经网络7日打卡营学习心得
2019-03-12
【自考】之信息资源管理(一)
2019-03-12
setup facatory9.0打包详细教程(含静默安装和卸载)
2019-03-12
ionic4 路由跳转传值
2019-03-12