当前位置: 首页 > article >正文

二叉树中堆的数据结构

堆的概念和结构如果有一个关键码的集合K {k1 k2 k3 …kn }把它的所有元素按完全二叉树的顺序存储方式存储在一个一维数组中i为下标并满足ki k(2i1)且 ki k(2i2)(ki k(2i1) 且 kik(2i2) ) i 012…则称为小堆(或大堆)。将根结点最大的堆叫做最大堆或大根堆根结点最小的堆叫做最小堆或小根堆。堆的性质堆中某个结点的值总是不大于或不小于其父结点的值堆总是一棵完全二叉树。下面是大堆的示例图堆的代码实现//堆的初始化voidHpInit(Hp*php){assert(php);php-aNULL;php-sizephp-capacity0;}//堆的销毁voidHpDestroy(Hp*php){assert(php);php-aNULL;php-sizephp-capacity0;}//交换函数voidSwap(int*p1,int*p2){inttmp*p1;*p1*p2;*p2tmp;}//向上调整voidAdjustUp(HpData*a,intchild){assert(a);intparent(child-1)/2;while(child0){if(a[child]a[parent]){Swap(a[child],a[parent]);childparent;parent(child-1)/2;}else{break;}}}//堆的插入向上调整版voidHpPush(Hp*php,HpData x){assert(php);if(php-capacityphp-size){intnewcapacityphp-capacity0?4:2*php-capacity;HpData*tmp(int*)realloc(php-a,newcapacity*sizeof(HpData));if(tmpNULL){perror(realloc fail!);return;}php-atmp;php-capacitynewcapacity;}php-a[php-size]x;php-size;AdjustUp(php-a,php-size-1);}// 堆数据的打印voidHpPrint(Hp*php){for(inti0;iphp-size;i){printf(%d ,php-a[i]);}printf(\n);}//向下调整voidAdjustDown(HpData*a,intparent,intsize){assert(a);intchild2*parent1;while(childsize){if(child1sizea[child]a[child1]){child;}if(a[child]a[parent]){Swap(a[child],a[parent]);parentchild;child2*parent1;}else{break;}}}//堆的插入向下调整版voidHpPush2(Hp*php,HpData x){assert(php);if(php-capacityphp-size){intnewcapacityphp-capacity0?4:2*php-capacity;HpData*tmp(int*)realloc(php-a,newcapacity*sizeof(HpData));if(tmpNULL){perror(realloc fail!);return;}php-atmp;php-capacitynewcapacity;}php-a[php-size]x;php-size;AdjustDown(php-a,0,php-size);}//判空boolHpEmpty(Hp*php){if(php-aNULL){returntrue;}else{returnfalse;}}//取堆顶数据HpDataHpTop(Hp*php){assert(php);returnphp-a[0];}//删除堆顶voidHpPop(Hp*php){Swap(php-a[0],php-a[php-size-1]);php-size--;AdjustDown(php-a,0,php-size);}堆排序通过上面的介绍我们已经了解了堆是如何实现的以及如何建立大堆和小堆所以接下来我们可以通过上面完成的向上和向下调整建堆来实现堆排序//向上调整建堆voidHpSort1(){intarr[]{4,6,1,7,9,8,2,5};//降序 先建小堆for(inti0;isizeof(arr)/sizeof(int);i){AdjustUp(arr,i);}intendsizeof(arr)/sizeof(int)-1;while(end0){Swap(arr[0],arr[end]);AdjustDown(arr,0,end);end--;}for(inti0;isizeof(arr)/sizeof(int);i){printf(%d ,arr[i]);}}//向下调整建堆voidHpSort2(){intarr[]{4,6,1,7,9,8,2,5};intnsizeof(arr)/sizeof(int);intendn;for(inti(n-1-1)/2;i0;i--){AdjustDown(arr,i,n);}while(end0){Swap(arr[0],arr[end-1]);AdjustDown(arr,0,end-1);--end;}for(inti0;isizeof(arr)/sizeof(int);i){printf(%d ,arr[i]);}}intmain(){HpSort1();printf(\n);HpSort2();return0;}我们这里实现的是降序排序代码解析首先我们两个代码都是进行建立小堆然后将堆顶最小的数与堆末尾的数据交换再进行向上或向下调整这样又把第二小的数放在了堆顶而我们使用了–end使得最小的数永远留在了堆末尾然后依次循环又不断地将次小的数据置在堆顶并与下标为end的数据交换再进行调整从而实现降序排序。注意事项向下调整建堆时间复杂度是 O (n)向上调整是 O (n log n)所以一般使用向下调整建堆向上调整建堆从第 0 个元素开始一个个插入堆每插入一个都要向上走到根最多走 树高 h log₂n总共 n 个节点复杂度O(n log n)向下调整建堆只调整非叶子节点从倒数第二层开始往前调越靠近底层的节点需要向下走的步数越少复杂度O(n)

相关文章:

二叉树中堆的数据结构

堆的概念和结构 如果有一个关键码的集合K {k1 &#xff0c;k2 &#xff0c;k3 &#xff0c;…&#xff0c;kn }&#xff0c;把它的所有元素按完全二叉树的顺序存储方式存储 在一个一维数组中&#xff0c;&#xff08;i为下标&#xff09;并满足&#xff1a;ki < k(2i1)且 k…...

3个突破式方法破解NCM加密:让音乐收藏在全设备自由流转

3个突破式方法破解NCM加密&#xff1a;让音乐收藏在全设备自由流转 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 当你精心收藏的网易云音乐下载到本地却发现是无法播放的NCM格式&#xff0c;当车载音响无法识别手机里的加密音乐文…...

OpenClaw小团队协作:Qwen3.5-9B共享任务队列实践

OpenClaw小团队协作&#xff1a;Qwen3.5-9B共享任务队列实践 1. 为什么我们需要共享任务队列 去年冬天&#xff0c;我们团队遇到了一个典型的工作瓶颈。当时有三个并行的数据处理项目需要在一周内完成&#xff0c;每个项目都涉及数据清洗、分析报告生成和可视化图表制作。传统…...

ESP32平台ST7703 RGB TFT驱动组件(PlatformIO兼容)

1. 项目概述htcw_esp_lcd_st7703是一个面向 PlatformIO&#xff08;PIO&#xff09;生态的 ESP-IDF 兼容 LCD 驱动组件&#xff0c;其核心目标是为基于 ESP32 系列 SoC&#xff08;尤其是 ESP32-S2/S3/C3/C6&#xff09;的嵌入式系统提供对 ST7703 RGB TFT 显示控制器的完整、可…...

OpenClaw+千问3.5-9B监控方案:网站异常自动检测与告警

OpenClaw千问3.5-9B监控方案&#xff1a;网站异常自动检测与告警 1. 为什么需要轻量级网站监控 去年我的个人博客遭遇了一次持续6小时的宕机&#xff0c;直到读者发邮件反馈才发现问题。传统监控工具如UptimeRobot虽然能检测HTTP状态&#xff0c;但无法识别内容篡改或样式异常…...

html 列表和表格的使用

1&#xff1a;列表是以结构化&#xff0c;易读性更强的方式提供信息的方法&#xff0c;我们学习了有序列表和无序列表。有序列表特点是有先后顺序&#xff0c;用数字&#xff0c;字母或数字标记&#xff0c;适合步骤&#xff0c;排名&#xff0c;流程&#xff0c;核心标签<o…...

OpenClaw故障诊断:Qwen3.5-9B接口超时问题排查实录

OpenClaw故障诊断&#xff1a;Qwen3.5-9B接口超时问题排查实录 1. 问题现象与初步判断 那天深夜&#xff0c;我正在调试一个自动化文档处理流程&#xff0c;OpenClaw突然开始频繁报错。控制台不断弹出"Model timeout after 30000ms"的警告&#xff0c;原本10秒内能…...

学术党福音:OpenClaw+Qwen3-32B自动生成LaTeX论文图表

学术党福音&#xff1a;OpenClawQwen3-32B自动生成LaTeX论文图表 1. 为什么需要自动化论文图表生成 作为长期与LaTeX搏斗的科研狗&#xff0c;我经历过无数次这样的深夜&#xff1a;在Python里调完matplotlib参数&#xff0c;手动导出PNG&#xff0c;再在LaTeX里反复调整\inc…...

CSS如何避免浮动元素换行_计算所有浮动元素的总宽度不超过父容器宽度

浮动元素换行是因子元素总宽度&#xff08;含padding、border、margin&#xff09;超过父容器可用宽度&#xff0c;导致最后一个被挤至下一行&#xff1b;这是float原始行为&#xff0c;非bug&#xff0c;需用box-sizing:border-box、flex布局等规避。浮动元素换行是因为父容器…...

OpenClaw多模态编程:Phi-3-vision-128k-instruct实现流程图转Python代码

OpenClaw多模态编程&#xff1a;Phi-3-vision-128k-instruct实现流程图转Python代码 1. 为什么需要流程图转代码工具 在原型开发阶段&#xff0c;我经常遇到这样的困境&#xff1a;在白板上画完清晰的流程图后&#xff0c;需要花费大量时间手动转换为可执行代码。这种重复劳动…...

OpenClaw多端同步:千问3.5-9B任务在手机与PC间无缝衔接

OpenClaw多端同步&#xff1a;千问3.5-9B任务在手机与PC间无缝衔接 1. 为什么需要跨设备任务同步&#xff1f; 去年冬天的一个深夜&#xff0c;我正躺在沙发上用手机浏览技术文档&#xff0c;突然想到需要运行一个数据分析脚本。但电脑在书房&#xff0c;实在不想起身。那一刻…...

OpenClaw数据清洗实战:千问3.5-27B处理混乱Excel表格

OpenClaw数据清洗实战&#xff1a;千问3.5-27B处理混乱Excel表格 1. 当Excel遇上非结构化数据&#xff1a;我的真实痛点 上周五下午6点&#xff0c;市场部的同事突然发来一份"紧急需求"——一份从20多个渠道手工合并的Excel文件&#xff0c;需要在下班前完成数据清…...

AMx8x5系列RTC驱动详解:嵌入式低功耗实时时钟集成方案

1. AMx8x5系列RTC驱动深度解析&#xff1a;面向嵌入式系统的高精度实时时钟集成方案AMx8x5并非单一芯片型号&#xff0c;而是一类高度兼容、引脚与寄存器级对齐的超低功耗实时时钟&#xff08;RTC&#xff09;器件家族的统称。该命名规则覆盖了Ambiq Micro&#xff08;原Ambiq …...

Jenkins Pipeline 脚本踩坑记:我是如何被两种语法折磨并最终选择的

最近在折腾公司的 CI/CD 流水线&#xff0c;想把原来那套老掉牙的构建脚本升级一下。本以为 Jenkins Pipeline 挺简单的&#xff0c;结果一上手就懵了——竟然有两种写法&#xff01;这不是逼死选择困难症吗&#xff1f; 我当时的内心OS&#xff1a;这玩意儿就像去饭店点菜&am…...

【26最新大英赛】全国大学生英语竞赛高频核心词汇表pdf电子版(考前必背单词)

2026年全国大学生英语竞赛将于4月12日举行&#xff0c;倒计时6天&#xff01;帮助广大考生高效备考&#xff0c;小编精心整理了最新的大英赛核心词汇&#xff0c;PDF电子版&#xff0c;可下载打印&#xff01; 资料下载&#xff1a; 资料下载https://pan.quark.cn/s/13eaf6fb0…...

Rust内存管理与安全:告别内存泄漏和空指针

Rust内存管理与安全&#xff1a;告别内存泄漏和空指针 后端转 Rust 的萌新&#xff0c;ID "第一程序员"——名字大&#xff0c;人很菜&#xff08;暂时&#xff09;。正在跟所有权和生命周期死磕&#xff0c;日常记录 Rust 学习路上的踩坑经验和"啊哈时刻"…...

嵌入式Linux无线服务器搭建指南

1. 项目概述在嵌入式Linux开发中&#xff0c;传统的有线网络连接方式往往限制了设备的灵活性和部署便捷性。作为一名嵌入式开发者&#xff0c;我最近成功在S3C2410开发板上实现了基于WiFi模块的无线服务器搭建&#xff0c;彻底摆脱了网线的束缚。这套方案不仅适用于智能家居控制…...

从单机到网络存储:用Windows Server自带的iSCSI功能,5分钟为你的测试机挂载个‘云硬盘’

从单机到网络存储&#xff1a;5分钟用Windows Server打造高效iSCSI共享空间 在软件开发与测试工作中&#xff0c;我们经常遇到需要快速共享存储空间的场景。无论是团队协作开发、自动化测试日志收集&#xff0c;还是临时搭建的演示环境&#xff0c;一个灵活高效的网络存储解决方…...

嵌入式调试技巧:使用串口、J-Link 定位 Bug 效率翻倍

在嵌入式软件开发领域&#xff0c;有一句广为流传的话&#xff1a;“写代码只占20%的时间&#xff0c;调试占了80%。”虽然这个比例因人而异&#xff0c;但调试确实是整个开发流程中最不可预测、最消耗精力的环节。当一个程序在硬件上“跑飞”了&#xff0c;或者某个外设莫名其…...

OpenClaw+Phi-3-mini-128k-instruct:自动化技术面试题库更新系统

OpenClawPhi-3-mini-128k-instruct&#xff1a;自动化技术面试题库更新系统 1. 为什么需要自动化题库更新 作为一名技术面试官转行的开发者&#xff0c;我深知保持题库时效性的痛苦。去年帮朋友准备面试时&#xff0c;发现他还在刷2018年的LeetCode老题&#xff0c;而新出现的…...

MacBook上运行OpenClaw:轻量级部署Kimi-VL-A3B-Thinking图文模型

MacBook上运行OpenClaw&#xff1a;轻量级部署Kimi-VL-A3B-Thinking图文模型 1. 为什么选择MacBook部署OpenClaw 作为一个长期在MacBook Pro上折腾AI工具的开发者&#xff0c;我一直在寻找能在本地流畅运行的多模态模型方案。直到遇到Kimi-VL-A3B-Thinking这个镜像&#xff0…...

Unity游戏开发:用Obi Softbody插件5分钟搞定角色手臂的弹性软体效果

Unity游戏开发&#xff1a;5分钟实现角色手臂弹性软体效果的高效方案 在风格化游戏角色设计中&#xff0c;弹性软体效果能为生物角色增添生动的物理质感。想象一个卡通章鱼角色的触须自然摆动&#xff0c;或是奇幻生物柔软触角对环境的真实反应——这些效果过去需要复杂的物理编…...

别再只盯着report_timing了!DC综合后,用report_constraint -all_violation全面排查时序与DRC违规(附实战解读)

别再只盯着report_timing了&#xff01;DC综合后全面排查时序与DRC违规的实战指南 在数字IC设计流程中&#xff0c;Design Compiler&#xff08;DC&#xff09;综合后的时序分析环节往往让工程师们又爱又恨。面对密密麻麻的违规报告&#xff0c;新手工程师常陷入两个极端&#…...

从CAN到UAVCAN:一文搞懂两种协议的核心差异及迁移指南

从CAN到UAVCAN&#xff1a;两种通信协议的深度解析与迁移实战 在嵌入式系统开发领域&#xff0c;CAN总线协议已经服务了汽车电子和工业控制三十余年&#xff0c;而它的进化版本UAVCAN正在无人机和机器人领域掀起一场通信革命。当我第一次在四旋翼飞行器项目中尝试将传统CAN节点…...

好消息!内存条开始降价了,价格能否回到2025年年初价?

今天又开始因为各种原因在电脑上折腾大模型了&#xff0c;但是发现一件很可怕的事情&#xff1a;16GB的内存真的不够用。 哈哈哈哈……这个Windows电脑因为有很长一段时间没有使用&#xff0c;所以在粉丝需要的时候&#xff0c;直接把一对16GB的内存条拆出来卖了&#xff0c;后…...

Flowable任务超时监控与自动化处理实战

1. 为什么需要Flowable任务超时监控&#xff1f; 在实际业务流程中&#xff0c;任务超时是个常见但容易被忽视的问题。想象一下&#xff0c;你提交了一个采购审批流程&#xff0c;但审批人迟迟没有处理&#xff0c;导致整个采购计划被耽误。这种情况在企业内部每天都在发生&…...

微元理论的数学化演算

一、理论思想总结&#xff08;一段式&#xff0c;完全还原你最新表述&#xff09;本理论借用希格斯标量场解释统标量场为宇宙唯一本源&#xff0c;在微观尺度下&#xff0c;标量场中两个无质量特性的标量子&#xff0c;当其间距大于普朗克作用量 h 所界定的临界尺度时&#xff…...

SAP ABAP老系统也能玩转REST API?手把手教你用SICF和IF_HTTP_EXTENSION打通接口

SAP ABAP老系统也能玩转REST API&#xff1f;手把手教你用SICF和IF_HTTP_EXTENSION打通接口 在数字化转型浪潮中&#xff0c;许多企业仍运行着历史悠久的SAP ABAP系统。这些系统承载着核心业务逻辑&#xff0c;却常因技术栈陈旧而难以与现代应用生态对接。本文将揭示如何利用AB…...

用SDNET2018和Crack500数据集训练YOLOv8,手把手教你搞定混凝土裂缝检测模型

基于SDNET2018与Crack500的YOLOv8裂缝检测实战指南 混凝土结构的安全评估中&#xff0c;裂缝检测是关键环节。传统人工巡检效率低下且易漏检&#xff0c;而基于深度学习的自动化方案能显著提升检测精度与效率。本文将手把手带您完成从数据集处理到模型部署的全流程&#xff0c;…...

OpenClaw文件管理:Qwen3-4B驱动的智能归类与重命名

OpenClaw文件管理&#xff1a;Qwen3-4B驱动的智能归类与重命名 1. 为什么需要智能文件管理 每次打开电脑&#xff0c;看到满屏杂乱无章的下载文件夹&#xff0c;我的强迫症都要发作一次。从项目文档、会议录音到临时截图&#xff0c;所有文件都堆在同一个目录下&#xff0c;找…...