数据结构《堆》
堆是一种特殊的数据结构它不同与我们队列和栈堆属于二叉树的范畴另外堆分为大堆和小堆大堆简单理解为就是父节点大于等于它的子节点小堆就是父节点小于等于它的子节点大堆小堆都属于完全二叉树。为了便于访问各个节点这里使用数组实现堆。已知父节点是i那么左子树就是2i1柚子树就是2i2已知任意一个子树节点的下标是i那么它的父节点就是i-1/2这是因为整数的除法只保留整数位。一、创建堆的结构体typedef int HPDataType; typedef struct Heap { HPDataType* _a; int _size; int _capacity; }Heap;这里的结构体内容同顺序表一样二、堆的初始化//堆的初始化 void HeapInit(Heap* php) { assert(php); php-_a NULL; php-_capacity 0; php-_size 0; }三、堆的销毁// 堆的销毁 void HeapDestory(Heap* hp) { assert(hp); if (hp-_a NULL) { return; } free(hp-_a); hp-_capacity 0; hp-_size 0; }四、堆的插入//向上调整 void AdjustUp(HPDataType* arr,int size) { assert(arr); int sub size - 1;//取到数组最后一个节点的下标 int son sub; int father (son - 1) / 2;//找到它的父亲 while (son 0)//子节点下标是永远不为0的 { if (arr[son] arr[father])//如果子节点小于父亲那么进行交换 { HPDataType flag arr[son]; arr[son] arr[father]; arr[father] flag; son father;//交换完成父节点成为新的子节点即向上调整 father (son - 1) / 2;//向上更新父节点 } else//不满足更新条件退出函数 { return; } } } // 堆的插入 void HeapPush(Heap* hp, HPDataType x) { assert(hp); //判断是否需要扩容 if (hp-_capacity hp-_size) { int newcapacity (hp-_capacity 0) ? 4 : hp-_capacity * 2; HPDataType* newhp (HPDataType*)realloc(hp-_a, newcapacity * sizeof(HPDataType)); if (newhp NULL) { perror(realloc error!); return; } hp-_a newhp; hp-_capacity newcapacity; } //插入数据在叶子上 hp-_a[hp-_size] x; hp-_size; //向上调整 AdjustUp(hp-_a, hp-_size); }为了保持小堆的格式这里使用尾插并向上调整的算法这个算法中传入的形式参数是需要调整的数组和该数组有效元素个数具体逻辑请看注释。五、堆数据的删除//向下调整 //sub是调整的目标的下标目的是将较小的数据移到靠近根 void AdjustDown(HPDataType* arr, int size ,int sub) { //确保有左孩子满足最小的交换条件 while (sub * 2 1 size) { int secondson; int bigson; //确保有右孩子才能进行左右孩子的交换 if (sub * 2 2 size) { //假设左孩子小于右孩子 secondson 2 * sub 1; bigson secondson 1; //如果左孩子大于右孩子则交换左右孩子下标 if (arr[secondson] arr[bigson]) { int flag bigson; bigson secondson; secondson flag; } } else//没有右孩子那么小儿子就是左孩子 { secondson 2 * sub 1; } //开始向下调整 //如果父亲大于两个孩子之间最小的那一个那么久做一次交换 if (arr[secondson] arr[sub]) { HPDataType newdata arr[secondson]; arr[secondson] arr[sub]; arr[sub] newdata; sub secondson; } else//未满足交换条件退出函数 { return; } } } // 堆的删除 void HeapPop(Heap* hp) { assert(hp); assert(hp-_size); hp-_a[0] hp-_a[hp-_size - 1];//交换最后一个节点和第一个节点 hp-_size--;//删除节点原理同顺序表 //向下调整 AdjustDown(hp-_a, hp-_size,0); }因为删除没有插入那样简单直接删除掉根之后他下边的所有子节点便群龙无首因此我们不能直接删除根所以有大神使用将首尾位节点互换然后再向下调整根的数据的算法。因为互换的叶子节点肯定比互换前的根大所以需要向下调整互换后的根节点。至于为什么要比较左右节点的大小那是因为我们要把尽可能小的数据移动到尽可能靠近根的位置所以才需要比较左右节点的大小以满足小堆的格式。六、取堆顶的数据// 取堆顶的数据 HPDataType HeapTop(Heap* hp) { assert(hp); return hp-_a[0]; }七、求堆的数据个数// 堆的数据个数 int HeapSize(Heap* hp) { return hp-_size;//返回数据个数 }八、堆的判空// 堆的判空 int HeapEmpty(Heap* hp) { return hp-_size 0;//判断堆的数据个数是否等于0如果是返回非0否返回0 }九、测试代码void test() { Heap HP; HeapInit(HP); for (int i 0; i 100; i)//随机生成100个数据并插入进堆 { HeapPush(HP, rand()%1000); } while (!HeapEmpty(HP))//按照顺序取出数据 { printf(%d , HeapTop(HP)); HeapPop(HP); } HeapDestory(HP); } int main() { test(); return 0; }十、测试结果满足小堆的结构。

相关新闻

为什么OBS Studio成为全球千万用户选择的免费直播录制软件?

为什么OBS Studio成为全球千万用户选择的免费直播录制软件?

为什么OBS Studio成为全球千万用户选择的免费直播录制软件? 【免费下载链接】obs-studio OBS Studio - Free and open source software for live streaming and screen recording 项目地址: https://gitcode.com/GitHub_Trending/ob/obs-studio OBS Studio作…

2026/8/14 21:12:17 阅读更多 →
一文读懂flutter_chat_box架构:Flutter跨平台ChatGPT应用的设计之道

一文读懂flutter_chat_box架构:Flutter跨平台ChatGPT应用的设计之道

一文读懂flutter_chat_box架构:Flutter跨平台ChatGPT应用的设计之道 【免费下载链接】flutter_chat_box Flutter开发的和ChatGPT聊天的App,全平台支持 项目地址: https://gitcode.com/gh_mirrors/fl/flutter_chat_box flutter_chat_box是一个基于…

2026/8/14 21:11:04 阅读更多 →
Intelli IDEA:Cannot connect to already running IDE instance. Process xxx is still running的原因及解决方法

Intelli IDEA:Cannot connect to already running IDE instance. Process xxx is still running的原因及解决方法

1.查看自己的idea以及版本这里用WebStorm2023.2 为例,环境为windows;2. 原因是jetbrain启动时候会在 C:\Users\lingm\AppData\Roaming\JetBrains\WebStorm2023.2 目录下创建一个.lock文件,这个文件打开里面记录的是当前idea的进程号,每次idea…

2026/8/14 21:12:51 阅读更多 →

最新新闻

AI培训现场防翻车:构建韧性应急体系与实战方案

AI培训现场防翻车:构建韧性应急体系与实战方案

1. 项目概述:当AI培训现场“翻车”时,我们到底在应对什么?上周,我作为主讲人参与了一场面向企业中层管理者的“AI工具赋能工作流”内部培训。原计划是用一个下午,通过几个生动的案例演示,让大家亲手体验AI如…

2026/8/15 3:01:20 阅读更多 →
SSD201/202嵌入式彩屏方案:从硬件选型到Linux系统开发与优化

SSD201/202嵌入式彩屏方案:从硬件选型到Linux系统开发与优化

1. 从“能用”到“好用”:为什么SSD201/202值得关注在嵌入式彩屏控制这个领域,从业者常常面临一个经典的“不可能三角”:性能、成本和开发难度。想要流畅驱动一块分辨率不错的TFT彩屏,传统方案要么是选择一颗高性能的MCU&#xff…

2026/8/15 3:01:20 阅读更多 →
HiveWE实战指南:4个阶段完成一张魔兽争霸III地图,告别编辑器卡顿时代

HiveWE实战指南:4个阶段完成一张魔兽争霸III地图,告别编辑器卡顿时代

HiveWE实战指南:4个阶段完成一张魔兽争霸III地图,告别编辑器卡顿时代 【免费下载链接】HiveWE A Warcraft III world editor. 项目地址: https://gitcode.com/gh_mirrors/hi/HiveWE 如果你玩过魔兽争霸III的自定义地图,大概率在某个深…

2026/8/15 3:01:20 阅读更多 →
数学建模竞赛72小时实战指南:从选题到论文的完整策略

数学建模竞赛72小时实战指南:从选题到论文的完整策略

1. 赛题分析与破题思路:从“看题”到“定题”的关键一步每年一到数学建模竞赛季,很多同学拿到赛题的第一反应就是“懵”。面对A、B、C、D四道风格迥异的题目,感觉每个都似懂非懂,每个都好像能做,但又不知道从何下手。这…

2026/8/15 3:01:20 阅读更多 →
数学建模竞赛中启发式算法与远程协作的实战复盘

数学建模竞赛中启发式算法与远程协作的实战复盘

1. 项目概述:一场特殊的建模竞赛复盘2020年的MathorCup数学建模竞赛,对于所有参赛者而言,都是一次极其特殊的经历。那一年,全球性的公共卫生事件改变了所有人的生活和工作方式,也深刻地影响了这场学术竞赛的形态。作为…

2026/8/15 3:01:20 阅读更多 →
高海拔环境下电子设备故障原理与防护全攻略

高海拔环境下电子设备故障原理与防护全攻略

1. 项目概述:高海拔环境对电子设备的“隐形杀手”很多朋友可能觉得,电子设备嘛,只要防水防摔,日常使用就没什么大问题。但如果你计划带着无人机去青藏高原航拍,或者带着单反相机去川西徒步,甚至只是带着笔记…

2026/8/15 3:00:20 阅读更多 →

日新闻

内景 空间站内部 中国空间站 太空 内仓

内景 空间站内部 中国空间站 太空 内仓

本项目为前几天收费帮学妹做的一个项目,在工作环境中基本使用不到,但是很多学校把这个当作编程入门的项目来做,故分享出本项目供初学者参考。 一、项目描述 空间站内部 中国空间站 太空 内仓 地址:本地PC端运行(或Web…

2026/8/15 0:00:30 阅读更多 →
重新定义数据接口:3个突破性场景让通达信数据读取更智能

重新定义数据接口:3个突破性场景让通达信数据读取更智能

重新定义数据接口:3个突破性场景让通达信数据读取更智能 【免费下载链接】mootdx 通达信数据读取的一个简便使用封装 项目地址: https://gitcode.com/GitHub_Trending/mo/mootdx 当我们面对海量金融数据时,传统的数据获取方式往往让我们陷入困境—…

2026/8/15 0:00:30 阅读更多 →
一文读懂快消WMS怎么选?2026年国内外10大主流WMS品牌盘点

一文读懂快消WMS怎么选?2026年国内外10大主流WMS品牌盘点

快消品(FMCG)是流通速度较快、竞争较为激烈的行业之一。一瓶饮料从出厂到消费者手中,往往只有几十天甚至几天的周转窗口。这决定了快消行业的仓储管理系统(WMS)与制造业、电商行业存在明显区别:它不仅需要管…

2026/8/15 0:02:30 阅读更多 →

周新闻

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁 【免费下载链接】baidupankey 在线查询网盘提取码(维护中 rm repo) 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 你是否曾经在深夜寻找一份重要资料&#x…

2026/8/13 2:38:34 阅读更多 →
如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南 【免费下载链接】chinese_license_plate_generator 中国车牌生成器 项目地址: https://gitcode.com/gh_mirrors/ch/chinese_license_plate_generator 中国车牌生成器是一个基于Python的开源项目&#xff0c…

2026/8/13 10:41:52 阅读更多 →
收藏!小白程序员轻松入门大模型,从Harness工程开始实践

收藏!小白程序员轻松入门大模型,从Harness工程开始实践

文章强调学习大模型不应只关注模型本身,而应重视模型外的系统搭建,即Harness。提出AgentModelHarness的实用公式,详细介绍Harness的四个层次:持久化层、执行层、控制层和观察与验证层。文章还探讨了上下文工程、工具设计、AGENTS.…

2026/8/13 10:41:51 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/14 13:40:53 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/14 14:06:45 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/15 2:35:29 阅读更多 →