数据结构《堆》
堆是一种特殊的数据结构它不同与我们队列和栈堆属于二叉树的范畴另外堆分为大堆和小堆大堆简单理解为就是父节点大于等于它的子节点小堆就是父节点小于等于它的子节点大堆小堆都属于完全二叉树。为了便于访问各个节点这里使用数组实现堆。已知父节点是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/10/9 5:23:35 阅读更多 →
一文读懂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/10/12 1:32:43 阅读更多 →
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/9/26 13:53:18 阅读更多 →

最新新闻

Kiln AI Server Python 客户端库使用指南:同步/异步 API 调用与高级定制实战

Kiln AI Server Python 客户端库使用指南:同步/异步 API 调用与高级定制实战

人工智能AI 应用AI 评测RAG微调提示工程开发工具桌面应用 【免费下载链接】Kiln Build, Evaluate, and Optimize AI Systems. Includes evals, RAG, agents, fine-tuning, synthetic data generation, dataset management, MCP, and more. 项目地址: https://gitcod…

2026/10/14 18:22:46 阅读更多 →
鸿蒙应用内添加服务卡片到桌面:权限配置至formId管理的完整实践

鸿蒙应用内添加服务卡片到桌面:权限配置至formId管理的完整实践

前两天有个开发者在我写的卡片文章下面留言:应用里能不能直接触发“添加卡片到桌面”?用户根本不知道要长按桌面再选卡片,好多功能做出来都没人发现。这个问题其实问的人挺多的。鸿蒙的服务卡片虽然好用,但系统默认的添加路径藏在…

2026/10/14 18:22:46 阅读更多 →
自制轻量级单片机UI框架:低资源平台的架构设计与内存优化

自制轻量级单片机UI框架:低资源平台的架构设计与内存优化

我最早动起"自制轻量级单片机UI框架"这个念头,是在一个被现成UI库逼疯的下午。手里这块板子的MCU只给了64KB Flash和16KB RAM,产品需求却要一个带按钮、进度条和多级菜单的界面。我试着把一个开源UI库编进去,编译完一看&#xff0c…

2026/10/14 18:22:46 阅读更多 →
51单片机红外遥控NEC解码与波形显示方案

51单片机红外遥控NEC解码与波形显示方案

简介:这是一套基于51单片机的红外遥控解码与波形显示项目资料,面向电子爱好者、嵌入式初学者以及单片机课程设计/毕业设计人群,解决从红外信号接收、脉冲解码到LCD波形显示的全流程实现问题。压缩包共38个文件、9.68MB,涵盖C语言源…

2026/10/14 18:22:46 阅读更多 →
uIP TCP/IP协议栈实战:从Client到Server的嵌入式移植全解析

uIP TCP/IP协议栈实战:从Client到Server的嵌入式移植全解析

简介:基于uIP协议栈的TCP客户端与服务器程序,源自ALIENTEK战舰STM32开发板第52章,面向使用STM32与ENC28J60进行嵌入式网络通信的开发者。资源包含完整工程与配套文档,共223个文件,以C语言源文件(76个.c&…

2026/10/14 18:22:46 阅读更多 →
JavaScript sort排序原理与常见陷阱解析

JavaScript sort排序原理与常见陷阱解析

先说个我自己的真实经历。有次帮同事排查一个列表排序问题,数据是几组数字,他写了 arr.sort() ,结果排出来是 [1, 10, 2, 22, 3] 这种完全看不懂的顺序。他盯着屏幕看了半天,第一反应是"sort排序坏了"。其实不是坏了…

2026/10/14 18:21:46 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 22:01:27 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 7:53:34 阅读更多 →