当前位置: 首页 > news >正文

堆的定义与实现

系列文章目录


文章目录

  • 系列文章目录
  • 前言
  • 一、堆的定义
  • 二、堆的实现
    • 1.大/小堆的构建
    • 2.堆的增删查

前言


一、堆的定义

结构基础:堆是基于完全二叉树的逻辑结构,用数组来物理实现。

核心性质:堆可分为大堆和小堆。
其中,大堆要求每个子树的父节点>=左右子节点。
小堆要求每个子树的父节点 <= 左右子节点。

//堆用C实现typedefintHPDataType;typedefstructHeap{HPDataType*_a;//堆元素的存放数组int_size;//有效元素个数int_capacity;//容量}Heap;

二、堆的实现

为什么堆可以用数组来实现?

因为数组可以实现快速的随机访问,操作更加简单。再加上完全二叉树不会浪费很多数组的空间。

1.大/小堆的构建

(以小堆为例)
为了让最小的数在堆顶,其余的小数都在其子树的父亲节点。
要用到“向下调整”的算法。来调整根节点和两子树的关系,是根保持为最小。

当parent = n, 左 child = 2 * n + 1, 右child = 2 * n + 2 基于数组实现的索引规律
//参数分别为 堆中元素(数组),元素总个数,需要向下调整的父亲节点voidAdjustdowm(HPDataType*a,intn,introot){intparent=root;intchild=2*parent+1;//先假设左孩子while(child<n)//结束条件:孩子节点不能大于总数{if(child<n&&a[child]>a[child+1]){child++;//右孩子小,使child走到右孩子}//如果孩子节点小于父亲节点if(a[child]<a[parent]){swap(&a[child],&a[parent]);parent=child;child=parent*2+1;}else{break;}}}

但向下调整的前提是单前节点的左右子树都是(小)堆,才能保证拿上来的是最小值。
所以要从最后一个节点的父亲节点开始向下调整,由下到上。

当孩子child = n时,parent = (n-1) /2 最后一个孩子是n-1, 得出最后一个父亲是(n-1-1)/2
//构建堆——以小堆为例for(inti=(n-1-1)/2;i>=0;i--)//从最后一个节点的父亲节点开始,从下往上才能保证左右子树都是小堆{AdjustDown(hp->_a,hp->_size,i);}

2.堆的增删查

如何在堆中增加一个数,而不破坏小堆的形式?
先把数据加在末尾,再使用向上调整算法,使数据到合适的地方。

//向上调整---(以小堆为例)AdjustUp(HPDataType*a,intn,intchild){intparent=(child-1)/2;while(child>0)//当child = 0时,才算调整完{if(a[child]<a[parent]){swap(&a[child],&a[parent]);child=parent;parent=(child-1)/2;}else{break;}}}

增加一个元素

// 堆的插入voidHeapPush(Heap*hp,HPDataType x){//插入时只能先在末尾插入,再调整到堆中合适的地方if(hp->_size==hp->_capacity){hp->_capacity*=2;HPDataType*tmp=(HPDataType*)realloc(hp->_a,sizeof(HPDataType)*hp->_capacity);if(tmp!=NULL){hp->_a=tmp;}else{printf("扩容失败");}}hp->_a[hp->_size++]=x;//需要将插入值向上调整AdjustUp(hp->_a,hp->_size,hp->_size-1);}

删堆顶的数据,是先将堆顶与数组最后一个元素交换,再删除最后一个元素,将新元素向下调整。
因为最后一个元素方面删除。

// 堆的删除——(肯定删的是堆顶的数据)voidHeapPop(Heap*hp){intend=hp->_size-1;if(end<0){return;}else{swap(&hp->_a[0],&hp->_a[end]);hp->_size--;AdjustDown(hp->_a,hp->_size,0);}}

http://www.gsyq.cn/news/127577.html

相关文章:

  • 从零开始掌握大数据建模:Hadoop与Spark实战解析
  • 计算机毕业设计springboot基于信息加密的校园迎新微信小程序 SpringBoot 架构下融合安全加密的大学新生指引微信小程序 基于密文传输与 SpringBoot 的高校迎新移动小程序
  • P14813 [CCPC 2024 哈尔滨站] 奇怪的上取整 个人题解
  • 深圳到长沙株洲湘潭衡阳邵阳岳阳常德张家界搬家公司搬家物流推荐!跨省搬家排行榜 - 物流人
  • UVa 12018 Juice Extractor
  • AI Agent在企业数字化转型中的关键角色与实施策略
  • 大模型岗位全解析:从预训练到应用开发,5大梯队深度指南+2026转型攻略
  • 【扣子编程】| 2000字实操指南(Coze最新上线)
  • 提示词工程精华总结:掌握ICIO框架与五大核心要素,AI应用效率翻倍,建议收藏!
  • SpringBoot勤工助学信息管理高效的平台|1125(领完整源码)可做计算机毕业设计JAVA、PHP、爬虫、APP、小程序、C#、C++、python、数据可视化、全套文案
  • 网络传输原理(TCP/IP)
  • AWS For Fluent Bit:高效日志收集与传输的Docker镜像
  • Collections.unmodifiableSet()
  • 一文彻底搞懂AI Agent:从概念到两种核心设计模式(图文详解)
  • 杭州到重庆、成都、昆明、贵阳、遵义、绵阳、宜宾、德阳搬家公司物流排行榜!搬家费用明细! - 物流人
  • Visual Studio 2026 开发 MAUI app 记录
  • LDR6500取电方案强势进入XM供应链
  • 影刀RPA实战:3步搞定希音客户行为数据提取,效率飙升[特殊字符]
  • CTF中Web题目的常见题型及解题姿势,零基础入门到精通,收藏这篇就够了
  • 还在手动处理跨境物流?RPA智能处理希音订单,效率暴增30倍![特殊字符]
  • CTF大揭秘:从DEF_CON到全民热潮的极客游戏
  • 北京到武汉、郑州、济南、长沙、西安、南宁、乌鲁木齐、兰州搬家公司专业排行榜!搬家费用明细! - 物流人
  • 北京到大连、沈阳、鄂尔多斯、包头、呼和浩特、长春、哈尔滨、大庆搬家公司可信赖度排行榜!搬家费用明细! - 物流人
  • python手写数字识别系统 CNN卷积神经网络算法 深度学习、pytorch 手写数字识别(建议收藏)✅ - 指南
  • MySQL禁止3表以上JOIN的原因详解
  • 黑盒测试方法:原理、技术与实践演进
  • PySpark实战 - 2.2 利用Spark SQL计算总分与平均分
  • 震惊!这家云服务器代理商竟让企业口碑飙升,背后真相揭秘!
  • 连续时间下的概率预测
  • 第七届全球校园人工智能算法精英大赛-算法巅峰赛产业命题赛第一赛季优化题--无人机配送