发布时间:2026/7/10 14:01:19
堆排序---图文并茂
目录大堆与小堆堆的逻辑结构和物理结构的关联堆排序的思路分两步第一步第二步堆排序的代码升序总结版本0. 父子节点的公式转换1. 完全二叉树是不是分为“左子树大、右子树小”两种2. 如果给我一个数组我怎么把它调整成堆大堆/小堆第一步找到最后一个非叶子节点第二步从后往前对每个非叶子节点执行“向下调整”3. 堆排序到底在干什么是不是就是把数组变成堆4. 你代码里那个 AdjustDown 是怎么工作的5. 总结一下面对一个数组我怎么操作堆排序的时间复杂度**O(n log n)**大堆与小堆二者都是完全二叉树。大堆父节点的值总是大于或等于子节点大堆父节点的值总是小于或等于子节点int child parent * 2 1; 父节点与子节点下标关系堆的逻辑结构和物理结构的关联物理结构是一个数组而逻辑结构是一个完全二叉树。堆排序的思路分两步例子如下现有数组a[]{1,9,3,4,8,3},要将其升序排列。第一步第一步要求升序则将其原堆建为大堆若要求降序则将其原堆建为小堆(原因在最后会讲)如何将原堆建为大堆用大白话讲就是先找到最后一层最右边的那一个叶子节点a再找a的父节点b从b开始进行向下调整操作然后遍历数组,重复向下调整操作下标减小直到0结束)。向下调整操作的代码voidAdjustDown(int*a,intn,intparent)// n是 要调整的堆 的 最后一个数 的下标1{//parent就是图中的父节点的下标intchildparent*21;while(childn){// 选出左右孩子中小/大的那个假设法if(child1na[child1]a[child])//child 1 n确保有右孩子才进行比较防越界{child;//此时孩子为右孩子}if(a[child]a[parent]){Swap(a[parent],a[child]);//父子交换parentchild;childparent*21;//父子向下更替}else{break;}}}纵观全过程每一个进行向下调整操作的数其左子树和右子树都是大堆其实这就是向下调整操作能进行的前提条件。第二步第二步堆顶与最后一个数进行交换将最后一个数不看做堆里的数堆里的数减少一个在堆顶处进行向下调整操作。重复操作直到堆里没有数。此刻整个数组已有序堆排序完成。第一步的若要求升序则将其原堆建为大堆若要求降序则将其原堆建为小堆在这里就明白了因为堆顶与最后一位进行了交换那么最大值其实在最后一位。堆排序的代码升序#includestdio.hvoidSwap(int*p1,int*p2)//交换函数{inttmp*p1;*p1*p2;*p2tmp;}voidAdjustDown(int*a,intn,intparent)// n是 要调整的堆 的 最后一个数 的下标1{//parent就是图中的父节点的下标intchildparent*21;while(childn){// 选出左右孩子中小/大的那个假设法if(child1na[child1]a[child])//child 1 n确保有右孩子才进行比较防越界{child;//此时孩子为右孩子}if(a[child]a[parent]){Swap(a[parent],a[child]);//父子交换parentchild;childparent*21;//父子向下更替}else{break;}}}voidHeapSort(int*a,intn){// 升序 -- 建大堆// 降序 -- 建小堆// 建堆--向下调整建堆 --O(N)for(inti(n-1-1)/2;i0;--i)//(n - 1 - 1) / 2:文中所指的b点的下标 遍历的过程{AdjustDown(a,n,i);}intendn-1;while(end0){Swap(a[0],a[end]);// 再调整选出次大的数AdjustDown(a,end,0);// end是 “要调整的堆” 的 最后一个数 的下标1--end;// “要调整的堆” 的 最后一个数一直在变因为堆中的数在变少}}intmain(){inta[]{1,9,3,4,8,3};intnsizeof(a)/sizeof(int);HeapSort(a,n);for(inti0;in;i){printf(%d ,a[i]);}return0;}执行结果为你提的这些问题很关键我来帮你把“堆、建堆、堆排序”彻底理清楚。先直接回答你最核心的几个疑问。总结版本0. 父子节点的公式转换已知子节点可以推出父节点✅已知父节点可以推出子节点✅已知子节点下标child推父节点下标parent公式parent (child - 1) / 2整数除法向下取整已知父节点下标parent推子节点下标公式左孩子left parent * 2 1右孩子right parent * 2 21. 完全二叉树是不是分为“左子树大、右子树小”两种不是。你混淆了二叉搜索树BST和堆。二叉搜索树左子树所有节点 根 右子树所有节点所以中序遍历是升序。堆大堆/小堆只要求父节点 子节点大堆或 子节点小堆左右孩子之间没有任何大小关系约束。所以完全二叉树只是形状最后一层靠左连续而堆是在这个形状上加了值的大小规则但不分左右。2. 如果给我一个数组我怎么把它调整成堆大堆/小堆步骤非常简单就两步第一步找到最后一个非叶子节点数组长度n最后一个元素下标是n-1。它的父节点下标是(n-1-1)/2 (n-2)/2这就是最后一个非叶子节点。第二步从后往前对每个非叶子节点执行“向下调整”从i (n-2)/2开始i--一直做到i0。对每个i调用AdjustDown(a, n, i)。为什么要从后往前因为向下调整的前提是当前节点的左右子树必须已经是堆。从最后一个非叶子节点开始它的左右孩子都是叶子节点单个节点可视为堆满足前提然后一步步往上就能把整棵树建成堆。用你给的代码就是for(inti(n-1-1)/2;i0;--i){AdjustDown(a,n,i);}这一步就叫建堆时间复杂度 O(N)。3. 堆排序到底在干什么是不是就是把数组变成堆堆排序 ≠ 建堆。堆排序分两步建堆把数组变成大堆或小堆。排序利用堆的性质反复取堆顶放到数组末尾最终使数组有序。举个例子升序排列先建大堆→ 堆顶是最大值。把堆顶a[0]和最后一个元素a[n-1]交换 → 最大值到了末尾。然后把末尾元素“移出堆”end--再对新的堆顶执行向下调整重新形成大堆。重复上述过程每次把当前最大值放到末尾最终整个数组升序。所以堆排序的最终结果是一个有序数组不是堆。建堆只是中间状态。4. 你代码里那个 AdjustDown 是怎么工作的AdjustDown的作用是假设左右子树都已经是大堆或小堆把父节点“沉”下去使整棵树恢复堆性质。具体逻辑找到父节点的左孩子child parent*21。如果有右孩子且右孩子更大大堆就选右孩子。如果孩子比父节点大交换然后继续向下调整。否则停止。5. 总结一下面对一个数组我怎么操作给你一个数组a[]要升序排序// 1. 建大堆for(inti(n-2)/2;i0;--i)AdjustDown(a,n,i);// 2. 排序intendn-1;while(end0){Swap(a[0],a[end]);// 堆顶放末尾AdjustDown(a,end,0);// 对剩余部分重新调整成大堆--end;}最终a[]就是升序的。堆排序的时间复杂度O(n log n)分两步算清清楚楚堆排序 建堆排序两步分开算第一步建堆建大堆/小堆for(inti(n-1-1)/2;i0;--i){AdjustDown(a,n,i);}每个节点向下调整最多走树的高度步O(log n)但不是所有节点都走 log n 步——叶子节点占一半根本不动越往上节点越少但走的路程越长精确计算下来总时间复杂度是O(n)不是 O(n log n)记住结论建堆是 O(n)第二步排序反复取堆顶intendn-1;while(end0){Swap(a[0],a[end]);// 交换堆顶和末尾AdjustDown(a,end,0);// 堆顶向下调整--end;}循环执行n-1次每次执行AdjustDown从堆顶走到叶子走树的高度步 O(log n)总时间 n × O(log n) O(n log n)总时间复杂度步骤时间复杂度建堆O(n)排序O(n log n)堆排序总计O(n log n)总结一句话堆排序的时间复杂度 O(n log n)空间复杂度 O(1)是不稳定的排序算法。注意稳定性指的是相同值的元素在排序后相对顺序是否改变堆排序在交换堆顶和末尾时可能改变相同值的顺序所以不稳定。

相关新闻

2025年版医保目录新增药品已惠及1200余万人次
2026/7/10 14:01:19

2025年版医保目录新增药品已惠及1200余万人次

7月9日讯,从国家医保局今天举行的2026年上半年例行新闻发布会上获悉,2025年版医保药品目录新增谈判药品已在全国31万家定点医药机构配备。截至目前,已有1200余万人次使用上2025年目录新增品种。医保药品目录关系到参保群众用药可及性和用药负…

阅读更多
DeviceKit源码架构深度解析:高性能iOS设备管理框架的技术实现
2026/7/10 14:01:19

DeviceKit源码架构深度解析:高性能iOS设备管理框架的技术实现

DeviceKit源码架构深度解析:高性能iOS设备管理框架的技术实现 【免费下载链接】DeviceKit DeviceKit is a value-type replacement of UIDevice. 项目地址: https://gitcode.com/gh_mirrors/de/DeviceKit DeviceKit作为iOS开发中的高性能设备管理框架&#x…

阅读更多
向量空间JBoltAI V5:聚焦本体语义落地
2026/7/10 13:01:19

向量空间JBoltAI V5:聚焦本体语义落地

不少企业在推进AI落地的过程中,都遇到过大模型对接完成后仍无法真正适配自身业务的问题,不同业务系统之间的数据分散,同一术语在不同业务场景下定义各不相同,想要跨系统调取关联数据时往往处处受阻,这些问题的核心根源…

阅读更多
Qt 路径相关 API
2026/7/10 15:01:19

Qt 路径相关 API

一、核心路径 API 1. QCoreApplication::applicationFilePath() 作用:获取 exe 完整绝对路径(目录 + exe 文件名) #include <QCoreApplication> #include <QDebug> QString exeFullPath = QCoreApplication::applicationFilePath(); qDebug() << "…

阅读更多
做餐饮海报没思路?整理6个资源站点,省时省心
2026/7/10 15:01:19

做餐饮海报没思路?整理6个资源站点,省时省心

不少餐饮从业者、门店美工&#xff0c;常常卡在海报制作环节&#xff1a;想做新品宣发、节日引流、特惠活动物料&#xff0c;没有排版灵感&#xff0c;实拍食物画面质感差&#xff0c;搜罗素材又杂乱零散。反复打磨耗时耗力&#xff0c;最后成品平淡没有食欲。整理6个优质素材站…

阅读更多
TMC7300与PIC18F47K42的有刷直流电机控制方案
2026/7/10 15:01:19

TMC7300与PIC18F47K42的有刷直流电机控制方案

1. TMC7300与PIC18F47K42的黄金组合解析有刷直流电机&#xff08;BDC&#xff09;在消费电子、工业控制和自动化设备中无处不在&#xff0c;但要让它们稳定运行并非易事。传统方案常面临启动抖动、转速波动和效率低下等问题。TMC7300这款来自TRINAMIC的智能驱动器芯片&#xff…

阅读更多
嵌入式系统电源管理优化:MAX77654与PIC18F86J50实战
2026/7/10 15:01:19

嵌入式系统电源管理优化:MAX77654与PIC18F86J50实战

1. 项目背景与核心需求在嵌入式系统设计中&#xff0c;电源管理一直是个让人头疼的问题。我最近接手的一个工业物联网终端项目就遇到了典型挑战&#xff1a;设备需要长时间电池供电&#xff08;3-7天&#xff09;&#xff0c;同时要支持多种工作模式&#xff08;全速运行、间歇…

阅读更多
语雀文档批量导出完整指南:轻松迁移知识库的终极解决方案
2026/7/10 15:01:19

语雀文档批量导出完整指南:轻松迁移知识库的终极解决方案

语雀文档批量导出完整指南&#xff1a;轻松迁移知识库的终极解决方案 【免费下载链接】yuque-exporter export yuque to local markdown 项目地址: https://gitcode.com/gh_mirrors/yuq/yuque-exporter 还在为如何将语雀上的宝贵文档安全备份到本地而烦恼吗&#xff1f;…

阅读更多
本地私有化接入Claude API,Cursor智能体开发全链路拆解,仅限前200位技术负责人掌握
2026/7/10 14:01:19

本地私有化接入Claude API,Cursor智能体开发全链路拆解,仅限前200位技术负责人掌握

更多请点击&#xff1a; https://codechina.net 第一章&#xff1a;本地私有化接入Claude API&#xff0c;Cursor智能体开发全链路拆解&#xff0c;仅限前200位技术负责人掌握 本地私有化接入Claude API的核心在于绕过Anthropic官方云服务&#xff0c;通过自建推理代理层实现模…

阅读更多
通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御
2026/7/9 20:12:34

通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

1. 项目概述与漏洞背景最近在梳理一些历史OA系统的安全风险时&#xff0c;通达OA v11.6版本中的一个老漏洞又进入了我的视线。这个漏洞位于/general/bi_design/appcenter/report_bi.func.php文件中&#xff0c;是一个典型的SQL注入点。虽然这个漏洞的利用方式看起来并不复杂&am…

阅读更多
3步彻底解决Windows右键菜单混乱问题:ContextMenuManager使用全攻略
2026/7/9 0:51:16

3步彻底解决Windows右键菜单混乱问题:ContextMenuManager使用全攻略

3步彻底解决Windows右键菜单混乱问题&#xff1a;ContextMenuManager使用全攻略 【免费下载链接】ContextMenuManager &#x1f5b1;️ 纯粹的Windows右键菜单管理程序 项目地址: https://gitcode.com/gh_mirrors/co/ContextMenuManager 你是否曾为Windows右键菜单中那些…

阅读更多
GXDE OS下Wayland兼容性实战:从deepin-mutter原理到VMware Tools修复
2026/7/8 22:48:04

GXDE OS下Wayland兼容性实战:从deepin-mutter原理到VMware Tools修复

如果你正在用 GXDE OS 或者任何基于 Deepin 的发行版&#xff0c;并且遇到了“检测到窗口系统采用 Wayland 协议&#xff0c;程序即将退出”这类弹窗&#xff0c;或者发现 VMware Tools 在 Ubuntu 24.04 这类默认 Wayland 的系统上启动失败&#xff0c;那这篇文章就是为你准备的…

阅读更多
Hive 倾斜 Join 实战:大表关联小表为什么也会慢
2026/7/10 0:01:17

Hive 倾斜 Join 实战:大表关联小表为什么也会慢

Hive 倾斜 Join 实战&#xff1a;大表关联小表为什么也会慢 一、一个反直觉的性能问题 "这不可能&#xff01;小表才 5 万行&#xff0c;大表 5 亿行&#xff0c;Join 一下怎么会跑两个小时&#xff1f;" 上个月同事小王盯着 Yarn 上快跑炸的 MapReduce 任务&#xf…

阅读更多
无需安装 Office,用 Python 轻松替换 Excel 数据
2026/7/10 0:01:17

无需安装 Office,用 Python 轻松替换 Excel 数据

核心对象模型 库的核心操作围绕两个对象展开&#xff1a; Workbook&#xff1a;代表整个 Excel 工作簿&#xff0c;负责文件的加载与保存 Worksheet&#xff1a;代表单个工作表&#xff0c;提供单元格访问与查找替换能力 导入方式&#xff1a; from spire.xls import * from …

阅读更多
WindowResizer:终极免费窗口强制调整工具,轻松突破Windows尺寸限制
2026/7/10 0:01:17

WindowResizer:终极免费窗口强制调整工具,轻松突破Windows尺寸限制

WindowResizer&#xff1a;终极免费窗口强制调整工具&#xff0c;轻松突破Windows尺寸限制 【免费下载链接】WindowResizer 一个可以强制调整应用程序窗口大小的工具 项目地址: https://gitcode.com/gh_mirrors/wi/WindowResizer 还在为那些无法拖拽的"顽固窗口&qu…

阅读更多
基于Dify与DeepSeek构建私有知识库问答系统实战指南
2026/7/8 18:15:39

基于Dify与DeepSeek构建私有知识库问答系统实战指南

在业务中快速构建一个能理解私有文档、准确回答专业问题的智能助手&#xff0c;是很多开发团队面临的共同挑战。传统方案往往需要从零开始搭建复杂的 RAG&#xff08;检索增强生成&#xff09;系统&#xff0c;涉及文档解析、向量化、检索、大模型调用等多个环节&#xff0c;整…

阅读更多
FAE放射组学分析工具:医学影像特征探索的完整解决方案
2026/7/8 10:11:21

FAE放射组学分析工具:医学影像特征探索的完整解决方案

FAE放射组学分析工具&#xff1a;医学影像特征探索的完整解决方案 【免费下载链接】FAE FeAture Explorer 项目地址: https://gitcode.com/gh_mirrors/fae/FAE 你是否曾经面对海量医学影像数据感到无从下手&#xff1f;想要从CT、MRI等影像中提取有价值的定量特征&#…

阅读更多
DesktopNaotu:你的终极离线思维导图解决方案,告别网络依赖!
2026/7/9 3:17:42

DesktopNaotu:你的终极离线思维导图解决方案,告别网络依赖!

DesktopNaotu&#xff1a;你的终极离线思维导图解决方案&#xff0c;告别网络依赖&#xff01; 【免费下载链接】DesktopNaotu 桌面版脑图 (百度脑图离线版&#xff0c;思维导图) 跨平台支持 Windows/Linux/Mac OS. (A cross-platform multilingual Mind Map Tool) 项目地址:…

阅读更多