news 2026/8/27 2:38:50

堆的定义与实现

作者头像

张小明

前端开发工程师

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/8/24 3:26:51

技术人必藏!2025年AI智能体全解析:六大分类、落地场景与商业价值

文章介绍了2025年AI从生成式AI向Agentic AI的关键转变&#xff0c;详细阐述了六大智能体分类及其应用场景和商业价值。数据显示88%早期采用者已获得投资回报&#xff0c;金融行业成为落地先锋。同时探讨了智能体发展面临的挑战与责任&#xff0c;以及未来智能体商店、个性化智能…

作者头像 李华
网站建设 2026/8/23 14:52:57

8款AI论文辅助工具全面评测:改写与原创写作能力分析

AI论文生成工具排行榜&#xff1a;8个网站对比&#xff0c;论文降重写作功能全工具对比总结根据核心功能、处理速度和用户反馈的综合评估&#xff0c;当前主流AI论文工具中&#xff0c;ChatGPT凭借强大的生成与改写能力位居榜首&#xff0c;Semantic Scholar因精准的学术检索功…

作者头像 李华
网站建设 2026/8/26 12:52:52

DeepSeek引爆新一轮AI投资热潮,2025年这些赛道值得关注!

DeepSeek以其开源、推理能力强、低成本特性&#xff0c;重塑了AI投资生态&#xff0c;使投资氛围从低迷转向活跃。2025年AI投资热点从大模型转向AI应用&#xff0c;投资人更加关注商业模式和场景落地。市场出现FOMO心态&#xff0c;急于寻找"下一个DeepSeek"。尽管一…

作者头像 李华
网站建设 2026/8/24 3:45:46

AWS For Fluent Bit:高效日志收集与传输的Docker镜像

AWS for Fluent Bit 项目描述 AWS for Fluent Bit 是由亚马逊官方维护的Docker镜像项目。它基于开源的 Fluent Bit 日志处理器&#xff0c;并预集成了针对亚马逊云服务&#xff08;Amazon CloudWatch Logs、Amazon Kinesis Data Streams、Amazon Kinesis Data Firehose&#xf…

作者头像 李华
网站建设 2026/8/27 0:11:35

RPA黑科技:3步自动优化希音商品页,效率飙升500%[特殊字符]

RPA黑科技&#xff1a;3步自动优化希音商品页&#xff0c;效率飙升500%&#x1f680;每天手动优化50个商品详情页到深夜&#xff1f;别让低效重复工作偷走你的爆款机会&#xff01;今天分享如何用影刀RPA打造智能优化机器人&#xff0c;原需8小时的任务现在5分钟自动完成——这…

作者头像 李华