当前位置: 首页 > 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.jsqmd.com/news/115637/

相关文章:

  • 杭州到长沙株洲湘潭衡阳邵阳岳阳常德张家界搬家公司搬家物流推荐!跨省搬家排行榜 - 物流人
  • 深圳到福州厦门莆田三明泉州漳州南平龙岩宁德搬家公司搬家物流推荐!跨省搬家排行榜 - 物流人
  • 复合材料abaqus umat子程序。 基于puck准则,内附inp文件及使用文档,可提供参考...
  • rtpengine-recording(8) 手册页
  • 我发现病理图像标注太贵 后来补多实例学习才稳住模型
  • P14813 [CCPC 2024 哈尔滨站] 奇怪的上取整 个人题解
  • 从零开始掌握大数据建模:Hadoop与Spark实战解析
  • 计算机毕业设计springboot基于信息加密的校园迎新微信小程序 SpringBoot 架构下融合安全加密的大学新生指引微信小程序 基于密文传输与 SpringBoot 的高校迎新移动小程序
  • 西电李龙团队6G智能超表面突破
  • 在电子测试中实施自动化测试设备(ATE)
  • DeepSeek引爆新一轮AI投资热潮,2025年这些赛道值得关注!
  • 计算机毕业设计springboot“智享圈”新媒体学习网站 基于SpringBoot的“智享汇”新媒体在线学习社区 SpringBoot驱动的“知媒学堂”互动式新媒体资源平台
  • 深圳到长沙株洲湘潭衡阳邵阳岳阳常德张家界搬家公司搬家物流推荐!跨省搬家排行榜 - 物流人
  • 1Arduino 简介
  • RAG框架选型实战:RAGFlow、Dify、n8n、coze四大框架全方位对比+落地决策树,避坑必看!
  • 大模型应用开发:从RAG到Agent的智能问答系统优化之路,解决场景区分不清的难题
  • 大模型应用开发:从RAG到Agent的智能问答系统优化之路,解决场景区分不清的难题
  • UVa 12018 Juice Extractor
  • JSP标签JSTL标签EL表达式
  • 大数据工程师必看:批处理性能优化的10个黄金法则
  • ProcessExplorer_17.09_x64-Chs 新版本升级:我看到的区别与优势(含升级思路与注意点)
  • SpringBoot勤工助学信息管理高效的平台|1125(领完整源码)可做计算机毕业设计JAVA、PHP、爬虫、APP、小程序、C#、C++、python、数据可视化、全套文案
  • COMSOL激光超声仿真:激光激发超声波的产生瑞利波的数值模拟 版本为6.1,低于此版本打不开此模型
  • AI Agent在企业数字化转型中的关键角色与实施策略
  • 从零到飞:四旋翼无人机智能控制与路径规划全解析
  • 3Arduino IDE 安装
  • AI Agent架构师必备:30个核心术语速成指南
  • 水凝膜、电镀钢化膜和UV光固膜哪个更防指纹,哪个透光更高呢?排序一下?
  • 【节点】[LinearToGammaSpaceExact节点]原理解析与实际应用
  • 2Arduino 板型号