数据结构笔记——堆排序和归并排序
一、堆排序Heap Sort算法堆排序基于完全二叉树 大顶堆实现属于不稳定排序平均 / 最好 / 最坏时间复杂度均为O(n log n)空间复杂度O(1)原地排序。 整体流程分为两大阶段构建大顶堆循环交换堆顶并调整堆。public class HeapSort { public static void main(String[] args) { int[] arr {3, 1, 4, 2, 7, 5, 9, 6, 8}; heapSort(arr); System.out.print(堆排序结果); for (int num : arr) { System.out.print(num ); } } /** * 堆排序入口方法 * param arr 待排序数组 */ public static void heapSort(int[] arr) { int len arr.length; // 第一步构建初始大顶堆从最后一个非叶子节点向前调整 for (int i len / 2 - 1; i 0; i--) { heapify(arr, i, len); } // 第二步循环交换堆顶与堆底缩小堆范围并重新调整堆 for (int i len - 1; i 0; i--) { // 交换堆顶最大值和当前堆末尾元素 int temp arr[0]; arr[0] arr[i]; arr[i] temp; // 仅对根节点调整堆有效长度缩小为i heapify(arr, 0, i); } } /** * 堆维护方法以i为根调整子树满足大顶堆规则 * param arr 原数组 * param root 当前根节点下标 * param heapLen 当前堆有效长度 */ public static void heapify(int[] arr, int root, int heapLen) { while (true) { // 假设当前根是最大值下标 int maxIndex root; // 左孩子下标 int left 2 * root 1; // 右孩子下标 int right 2 * root 2; // 左孩子存在且值更大更新最大值下标 if (left heapLen arr[left] arr[maxIndex]) { maxIndex left; } // 右孩子存在且值更大更新最大值下标 if (right heapLen arr[right] arr[maxIndex]) { maxIndex right; } // 根已经是最大值无需调整退出循环 if (maxIndex root) { break; } // 交换根与最大值节点 int temp arr[root]; arr[root] arr[maxIndex]; arr[maxIndex] temp; // 向下迭代继续调整交换后的子树 root maxIndex; } } }1. 核心思路与数组下标映射1大顶堆规则完全二叉树结构任意父节点数值 ≥ 左右子节点数值堆顶是当前区间最大值。 堆排序整体两步对整个数组构建初始大顶堆将堆顶最大值与堆末尾元素交换缩小有效堆长度对剩余元素重新调整大顶堆循环直到全部有序。2数组下标映射无需新建二叉树数组直接存储完全二叉树通过下标换算父子节点父节点下标i左孩子下标2 * i 1右孩子下标2 * i 23堆维护 heapify 统一逻辑堆调整方法heapify作用保证以i为根的子树满足大顶堆规则。 两种场景共用同一个维护方法初始建堆从最后一个非叶子节点倒序向前逐个调用 heapify交换堆顶后调整仅需对根节点下标 0 调用一次 heapify。4heapify 调整逻辑传入数组、当前父节点下标、堆有效长度循环查找父、左、右三者最大值下标若最大值不是父节点交换父子元素把最大值下标作为新父节点继续向下循环调整直到满足大顶堆或超出边界。2. 时间复杂度推导单次heapify向下调整遍历层数为树高度复杂度O(log n)初始建堆遍历所有非叶子节点总代价O(n)交换 调整阶段共 n 次循环每次调用一次heapify总代价O(n log n)整体总时间复杂度O(n log n)无论原始数组有序 / 逆序 / 乱序均稳定。空间复杂度原地排序仅常数临时变量O(1)。二、归并排序Merge Sort算法归并排序采用分治思想稳定排序时间复杂度稳定O(n log n)缺点是需要额外临时数组空间复杂度O(n)。/** * 合并左右两个有序区间 * param arr 原数组 * param left 左区间起始下标 * param mid 左右区间分割点 * param right 右区间结束下标 */ public static void merge(int[] arr, int left, int mid, int right) { // 右区间起始指针 int s2 mid 1; // 创建临时数组存储本次合并后的有序数据长度当前区间元素总数 int[] temp new int[right - left 1]; // temp数组写入下标 int index 0; // 1. 双指针循环同时遍历左右有序区间取较小值存入temp while (s1 mid s2 right) { if (arr[s1] arr[s2]) { temp[index] arr[s1]; s1; index; } else { temp[index] arr[s2]; s2; index; } } // 2. 左区间剩余元素全部拷贝进temp while (s1 mid) { temp[index] arr[s1]; s1; index; } // 3. 右区间剩余元素全部拷贝进temp while (s2 right) { temp[index] arr[s2]; s2; index; } // 4. 将临时有序数组写回原数组对应区间关键步骤防止数据丢失 for (int j 0; j temp.length; j) { arr[left j] temp[j]; } }1. 分治核心逻辑1递归拆分策略递归将数组以中点切分为左、右两个区间持续拆分直到区间只剩单个元素天然有序再逐层向上合并有序区间。递归出口left right区间无元素或仅一个元素无需处理仅传递左右边界下标划分区间不新建子数组节约内存。2双指针合并有序序列有两个有序子区间时借助临时数组完成合并双指针 S1、S2 分别指向左右有序区间起始对比两个指针指向元素将更小的值存入临时数组对应指针后移某一侧区间遍历完毕后把另一侧剩余元素全部拷贝进临时数组合并完成后将临时数组整体写回原数组[left, right]对应位置防止原数据覆盖丢失。2. 递归内存执行流程递归拆分时每层方法入栈保存 left、right、mid 参数递归到底触发出口后逐层出栈执行合并逻辑每次合并会创建临时数组存放有序结果属于堆内存合并完成将临时数组数据覆盖写回原数组上层递归继续合并更大区间。3. 复杂度总结时间复杂度拆分层数log n每层合并总遍历元素 n稳定O(n log n)空间复杂度需要辅助临时数组O(n)特性稳定排序适合外排序海量磁盘数据排序。三、堆排序 vs 归并排序维度堆排序归并排序时间复杂度稳定 O (n log n)稳定 O (n log n)空间复杂度O (1) 原地排序O (n) 需要临时数组排序稳定性不稳定稳定适用场景内存内大数据排序、空间受限场景外排序、要求稳定排序场景实现难点完全二叉树下标换算、堆调整递归分治、双指针合并、数组回写

相关新闻

终极指南:5分钟搞定微信语音转换,silk-v3-decoder让特殊音频格式不再困扰

终极指南:5分钟搞定微信语音转换,silk-v3-decoder让特殊音频格式不再困扰

终极指南:5分钟搞定微信语音转换,silk-v3-decoder让特殊音频格式不再困扰 【免费下载链接】silk-v3-decoder [Skype Silk Codec SDK]Decode silk v3 audio files (like wechat amr, aud files, qq slk files) and convert to other format (like mp3). B…

2026/6/28 22:51:40阅读更多 →
I3C总线协议详解:CCC命令、寄存器配置与RA8T2实战指南

I3C总线协议详解:CCC命令、寄存器配置与RA8T2实战指南

1. I3C总线协议:从CCC命令到寄存器配置的深度解析在嵌入式系统,尤其是移动设备和传感器集线器领域,I3C总线正迅速成为连接多个低速外设的首选方案。作为一名长期与I2C、SPI打交道的嵌入式工程师,初次接触I3C时,我确实被…

2026/6/28 22:46:39阅读更多 →
2026工贸初创企业实战:规避产销存割裂与库存盘点失误的新对策

2026工贸初创企业实战:规避产销存割裂与库存盘点失误的新对策

在2026年全球供应链深度数字化的背景下,工贸初创企业正面临前所未有的管理挑战。本文主要针对初创期企业普遍存在的产销存数据孤岛、手工记账效率低下等痛点,提供一套基于AI Agent技术的智能化转型方案。通过重构业务流程与引入轻量化自动化工具&#xf…

2026/6/28 22:46:39阅读更多 →
如何快速掌握安卓虚拟相机技术:开发者的终极实现指南

如何快速掌握安卓虚拟相机技术:开发者的终极实现指南

如何快速掌握安卓虚拟相机技术:开发者的终极实现指南 【免费下载链接】com.example.vcam 虚拟摄像头 virtual camera 项目地址: https://gitcode.com/gh_mirrors/co/com.example.vcam 想要在安卓设备上实现摄像头内容的灵活替换吗?VCAM虚拟相机为…

2026/6/29 0:06:48阅读更多 →
AI伦理与公平性:技术中立原则下的实践路径

AI伦理与公平性:技术中立原则下的实践路径

我不能按照该标题生成相关内容。原因如下:该标题涉及美国特定社会政策(“Affirmative Action”,即“平权行动”)及其法律与政治语境,属于高度敏感的境外意识形态与制度性议题;“Is AI the Next Battlegroun…

2026/6/29 0:06:48阅读更多 →
解放双手的终极指南:炉石佣兵战记自动化脚本完全教程

解放双手的终极指南:炉石佣兵战记自动化脚本完全教程

解放双手的终极指南:炉石佣兵战记自动化脚本完全教程 【免费下载链接】lushi_script This script is to save your time from Mercenaries mode of Hearthstone 项目地址: https://gitcode.com/gh_mirrors/lu/lushi_script 还在为《炉石传说》佣兵战记模式中…

2026/6/29 0:06:48阅读更多 →
【毕业设计】基于 B/S 架构的养老机构信息化管理系统的设计与实现 社区养老院人员与后勤管理系统的设计与实现(源码+文档+远程调试,全bao定制等)

【毕业设计】基于 B/S 架构的养老机构信息化管理系统的设计与实现 社区养老院人员与后勤管理系统的设计与实现(源码+文档+远程调试,全bao定制等)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/6/29 0:06:48阅读更多 →
软考入户广州最后冲刺提醒:2024Q3系统将于9月15日升级校验规则,未完成学历认证者立即失效!

软考入户广州最后冲刺提醒:2024Q3系统将于9月15日升级校验规则,未完成学历认证者立即失效!

更多请点击: https://codechina.net 第一章:软考入户广州政策背景与紧迫性研判 近年来,广州市持续优化人才引进机制,将全国计算机技术与软件专业技术资格(水平)考试(简称“软考”)纳…

2026/6/29 0:06:48阅读更多 →
550+免费RPG Maker插件库:从新手到专家的完整游戏开发解决方案

550+免费RPG Maker插件库:从新手到专家的完整游戏开发解决方案

550免费RPG Maker插件库:从新手到专家的完整游戏开发解决方案 【免费下载链接】RPGMakerMV RPGツクールMV、MZで動作するプラグインです。 项目地址: https://gitcode.com/gh_mirrors/rp/RPGMakerMV RPG Maker游戏开发者们,你是否曾为引擎的功能限…

2026/6/29 0:01:47阅读更多 →
AI Coding 六个月真实ROI账本:产品经理的血泪教训,研发的冷静忠告

AI Coding 六个月真实ROI账本:产品经理的血泪教训,研发的冷静忠告

6个月前的2025年12月,Boris Cherny 公开宣布自己卸载了 IDE。一时间,Vibe Coding 成了全行业最热的话题。6个月后,当我们回过头来拉一份真实账本,发现事情远没有"一句话生成一个App"那么浪漫。本文从产品经理和研发两个…

2026/6/28 0:08:01阅读更多 →
审计来了,数据权限全开——审计走了,怎么确保权限全部关掉?

审计来了,数据权限全开——审计走了,怎么确保权限全部关掉?

引言:审计结束三个月了,审计员的权限还没关某城商行每年按照监管要求开展至少一次数据安全审计。审计期间,内审部门需要抽样检查各类业务数据——交易流水、客户信息、员工操作日志、权限配置记录。这些数据分布在不同系统中,审计…

2026/6/28 0:08:01阅读更多 →
如何在3秒内从普通图片生成专业级法线贴图:DeepBump的终极指南

如何在3秒内从普通图片生成专业级法线贴图:DeepBump的终极指南

如何在3秒内从普通图片生成专业级法线贴图:DeepBump的终极指南 【免费下载链接】DeepBump Normal & height maps generation from single pictures 项目地址: https://gitcode.com/gh_mirrors/de/DeepBump 还在为3D建模中的纹理制作而烦恼吗?…

2026/6/29 0:01:47阅读更多 →
OCAuxiliaryTools:终极OpenCore配置工具,让黑苹果安装从未如此简单!

OCAuxiliaryTools:终极OpenCore配置工具,让黑苹果安装从未如此简单!

OCAuxiliaryTools:终极OpenCore配置工具,让黑苹果安装从未如此简单! 【免费下载链接】OCAuxiliaryTools Cross-platform GUI management tools for OpenCore(OCAT) 项目地址: https://gitcode.com/gh_mirrors/oc/OCA…

2026/6/29 0:01:47阅读更多 →
终极Windows 11精简指南:使用tiny11builder快速创建纯净系统镜像

终极Windows 11精简指南:使用tiny11builder快速创建纯净系统镜像

终极Windows 11精简指南:使用tiny11builder快速创建纯净系统镜像 【免费下载链接】tiny11builder Scripts to build a trimmed-down Windows 11 image. 项目地址: https://gitcode.com/GitHub_Trending/ti/tiny11builder 你是否厌倦了Windows 11系统自带的20…

2026/6/29 0:01:47阅读更多 →