news 2026/6/1 21:13:26

堆的定义与实现

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
堆的定义与实现

系列文章目录


文章目录

  • 系列文章目录
  • 前言
  • 一、堆的定义
  • 二、堆的实现
    • 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);}}

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/31 7:39:37

从零到飞:四旋翼无人机智能控制与路径规划全解析

当梦想起飞,智能导航让无人机自由翱翔 想象一下,一架四旋翼无人机在复杂的城市环境中自主飞行,精准避开高楼大厦,穿越狭窄的巷道,最终稳稳降落在目标位置。这听起来像是科幻电影的场景,但今天,我们将通过SIMULINK实现这一切!让我们一同探索无人机控制的奥秘,用代码让…

作者头像 李华
网站建设 2026/6/1 1:26:03

Linux操作系统自带的测试内存泄漏的命令

Linux操作系统自带的测试内存泄漏的命令&#xff1a; watch -n 1 "ps -o vsz,rss,pmem,comm -p pidof DataBridgeDeamon 通过查看&#xff1a;rss的数据变化来粗略的判断是否有内存泄漏。 在嵌入式开发和 Qt 编程中&#xff0c;内存泄漏&#xff08;Memory Leak&#xff0…

作者头像 李华
网站建设 2026/6/1 1:30:33

学读书类比大语言模型训练?通俗易懂掌握AI核心原理

大语言模型训练类比人类学习过程&#xff0c;分为三步&#xff1a;预训练从互联网学习基础知识并构建预测模型&#xff1b;监督微调通过问答数据教会模型回答问题&#xff1b;强化学习让模型自主探索最佳解决方案&#xff0c;形成思维链。本质上&#xff0c;AI大语言模型是一个…

作者头像 李华
网站建设 2026/6/1 3:13:16

AI落地六大黄金场景:从营销到政策驱动,附国内及出海成功案例,技术收藏必读

本文详细探讨了AI最有可能率先落地的六大场景&#xff1a;营销与客户运营智能化、生产流程与供应链优化、办公自动化与内部管理提效、垂直行业场景化解决方案、智能硬件与终端应用创新、政策驱动下的普惠化与生态协同。每个场景均分析了功能、实现方式及成功案例&#xff08;包…

作者头像 李华
网站建设 2026/6/1 6:05:33

前端开发:提示词驱动的全链路

2025 前端开发大变局&#xff1a;从“手写代码”到“提示词驱动”的全链路革命 引言&#xff1a;前端开发的新常态 在 2025 年&#xff0c;如果你还在逐行敲入 <div> 和 handleOnClick&#xff0c;那么你可能正在掉队。前端领域已经进入了**“提示词即开发” (Prompt-a…

作者头像 李华
网站建设 2026/5/31 19:07:18

影刀RPA实战:3步搞定希音客户行为数据提取,效率飙升[特殊字符]

影刀RPA实战&#xff1a;3步搞定希音客户行为数据提取&#xff0c;效率飙升&#x1f680;每天手动整理希音数据浪费3小时&#xff1f;别让低效重复工作偷走你的创作时间&#xff01;今天分享如何用影刀RPA打造智能数据提取机器人&#xff0c;原需半天的任务现在3分钟自动完成—…

作者头像 李华