news 2026/6/23 3:44:30

堆的定义与实现

作者头像

张小明

前端开发工程师

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/6/22 8:01:04

计算机毕业设计springboot“智享圈”新媒体学习网站 基于SpringBoot的“智享汇”新媒体在线学习社区 SpringBoot驱动的“知媒学堂”互动式新媒体资源平台

计算机毕业设计springboot“智享圈”新媒体学习网站d272d520 &#xff08;配套有源码 程序 mysql数据库 论文&#xff09; 本套源码可以在文本联xi,先看具体系统功能演示视频领取&#xff0c;可分享源码参考。当“学习”从教室搬到指尖&#xff0c;知识就拥有了新的流量入口。短…

作者头像 李华
网站建设 2026/6/22 23:03:56

5款AI开源神器收藏必备!从流程图生成到视频推理,轻量级模型到智能代理,一文全掌握

本文介绍了5款AI领域优质开源项目&#xff1a;大模型控制流程图生成工具、轻量级视频生成框架LightX2V、超小型语言模型MiniMind、个人PC大模型启动器Shimmy以及通用AI代理Ailice。这些工具涵盖自然语言绘图、多模态生成、轻量级推理等多种应用场景&#xff0c;均提供完整开源代…

作者头像 李华
网站建设 2026/6/23 1:25:34

AI Agent架构师必备:30个核心术语速成指南

本文整理了AI Agent领域的30个核心术语&#xff0c;涵盖智能体基本概念、工作机制、系统架构及技术实现。这些术语是理解现代AI智能体思考、行动和协作方式的基础知识&#xff0c;对使用LangChain、Spring AI等智能体框架的开发者尤为重要&#xff0c;能帮助理清关键构成模块间…

作者头像 李华
网站建设 2026/6/22 22:54:44

网络传输原理(TCP/IP)

将内存中某个地址的数据通过网口发送出去&#xff0c;本质是数据从用户态内存→内核态内存→网卡硬件→物理链路的传递过程&#xff0c;同时伴随TCP/IP 协议栈的逐层封装和操作系统 / 硬件的资源调度。以下按 ** 软件层&#xff08;应用 内核&#xff09;→硬件层&#xff08;…

作者头像 李华
网站建设 2026/6/20 17:27:15

大模型应用开发:从RAG到Agent的智能问答系统优化之路,解决场景区分不清的难题

文章讲述了智能问答系统从纯RAG技术到结合Agent技术的优化过程。针对三个子场景中结构化和非结构化数据混合查询的问题&#xff0c;作者最初按场景建立三个知识库&#xff0c;但遇到召回率低、场景判断不准的困境。后改为从数据类型维度建立两个知识库&#xff08;结构化和非结…

作者头像 李华
网站建设 2026/6/21 20:05:25

一文彻底搞懂AI Agent:从概念到两种核心设计模式(图文详解)

本文详细介绍了AI Agent的概念&#xff0c;解释了它如何通过工具实现对外部环境的感知和改变&#xff0c;重点阐述了ReAct模式和Plan-And-Execute模式两种核心设计原理。ReAct模式通过思考-行动-观察的循环处理任务&#xff0c;而Plan-And-Execute模式则先制定计划再执行&#…

作者头像 李华