数据结构——内部排序与外部排序:八大排序对比与多路归并
📅 2026/7/12 12:41:20
👁️ 次浏览
前面两篇讲了插入、快速、归并、堆排等主要排序算法这篇做一次完整的对比总结并讲 408 常考的外部排序。一、八大排序算法对比排序算法平均时间最好最坏空间稳定特点直接插入O(n²)O(n)O(n²)O(1)✅数据基本有序时很快希尔排序O(n^1.3)O(n)O(n²)O(1)❌插入的改进版冒泡排序O(n²)O(n)O(n²)O(1)✅教科书用的多实战少快速排序O(n log n)O(n log n)O(n²)O(log n)❌最常用的排序简单选择O(n²)O(n²)O(n²)O(1)❌性能稳定地差堆排序O(n log n)O(n log n)O(n log n)O(1)❌不稳定但最坏也快归并排序O(n log n)O(n log n)O(n log n)O(n)✅稳定且最快最坏一致基数排序O(d(nr))O(d(nr))O(d(nr))O®✅适合整数排序选型建议数据量小1000插入排序简单且稳定 数据量中等1000-10万快速排序最快的通用排序 数据量大且需稳定10万归并排序 数据量大且需最坏也有保证堆排序 整数且范围小基数排序 内存不够外部排序多路归并二、排序算法的稳定性分析哪些排序是稳定的稳定插入排序、冒泡排序、归并排序、基数排序 不稳定选择排序、希尔排序、快速排序、堆排序为什么稳定很重要// 场景先按姓名排序再按分数排序// 如果排序是稳定的那么同分的人依然保持姓名顺序// 第一遍按姓名排序// 张三(85), 李四(90), 王五(85)// 第二遍按分数排序稳定排序// 张三(85), 王五(85), 李四(90)// 张三和王五的同分情况下仍保持第一次排序的姓名顺序三、外部排序当数据量太大无法全部加载到内存时需要使用外部排序。1. 外部排序的基本思想内存放不下用磁盘做中转 外部排序 排序阶段 归并阶段 排序阶段将大文件分成若干小块分别读入内存排序后写回 归并阶段将多个有序小块合并成一个有序大文件2. 两路归并初始数据4个有序段R1, R2, R3, R4每个段已内部排序 第一趟归并 R1 R2 → S1合并两个有序段结果仍有序 R3 R4 → S2 第二趟归并 S1 S2 → 最终有序文件 需要2个内存缓冲区每路一个 IO次数每趟归并读写所有数据一次 总共IO次数 2 × 趟数 × 数据量3. 多路归并k 路归并使用 k 个缓冲区每次从 k 个段中选最小的一个输出 优势减少归并趟数 m 个初始段k 路归并 → 需要 logₖ(m) 趟 代价需要更大的内存缓冲区 每路一个缓冲区k 路需要 k 个缓冲区 选最小元素需要比较 k-1 次或用败者树优化4. 败者树败者树用于在多路归并中快速选出最小的元素。败者树的工作原理 叶子节点存放 k 个段当前比较的元素 内部节点存放两两比较的败者较大的元素 根节点存放最终胜出者最小的元素 当选出最小元素后该段的下一个元素补充到叶子节点 重新调整败者树只需比较 log₂(k) 次 比每次比较 k-1 次快得多5. 外部排序的时间开销/** * 外部排序的总时间 * 内部排序时间 磁盘IO时间 归并比较时间 * * 主要瓶颈在磁盘 IO 上 * 因此优化重点是减少 IO 次数 * * 减少 IO 的方法 * 1. 增大内存缓冲区减少初始段数量 * 2. 增加归并路数减少归并趟数 * 3. 使用败者树减少内部比较时间 */6. 最佳归并树类似哈夫曼树但叶节点权值表示归并段长度 每次合并长度最短的 k 个段 总IO次数 Σ段长度 × 归并深度 与哈夫曼树的区别 哈夫曼树每次合并2个最小节点 最佳归并树每次合并k个最小节点 注意k 路归并的最佳归并树 初始段数 m 必须满足 (m-1) % (k-1) 0 如果不满足需要补充长度为 0 的虚段7. 置换选择排序置换选择排序用于生成更长的初始归并段 传统方法内存最多排多少段就有多长 置换选择可以生成≈2倍内存大小的段 思想 内存中维护一个堆 每次输出堆顶元素后从输入文件读入一个新元素 如果新元素 ≥ 刚输出的元素加入堆中继续 否则标记为下一段当前段结束 这样生成的段平均长度 ≈ 2 × 内存容量 初始段减少归并趟数也减少四、408 考研常见考题题1排序算法的稳定性判断题目对 {4, 2, 4, 1, 5} 用快速排序 第一次划分后{1, 2, 4, 4, 5} 两个 4 的相对位置看划分算法 如果选第一个元素 4 作为 pivot 划分后第一个 4 和第二个 4 可能交换位置 → 不稳定的题2外部排序的 IO 次数1000 个记录内存可容纳 100 个 初始段数1000/100 10 个 4 路归并的趟数log₄(10) 2 趟第一趟10→3第二趟3→1 总 IO 次数2 × 2 × 1000 4000 次 每趟读写各一次两趟共读写各两次题3最佳归并树的构造初始段长度{8, 6, 5, 4, 3, 2} 3 路归并 (6-1)%(3-1)5%2≠0需要补充1个虚段 构造 第一轮选最小的 3 个 → 2349 → {9, 8, 6, 5} 第二轮选最小的 3 个 → 56819 → {19, 9} 第三轮选最小的 3 个 → 919028 → {28} 总 IO 次数 86543228 56每块读写各算一次五、排序算法选择决策树数据量很小50 ├── 是 → 插入排序代码简单常数小 └── 否 → 数据基本有序 ├── 是 → 插入排序O(n) └── 否 → 内存够用 ├── 是 → 快速排序 └── 否 → 外部排序多路归并 需要稳定排序 ├── 是 → 归并排序 └── 否 → 快速排序或堆排序总结内部排序核心比较和交换 外部排序核心归并 排序算法选择根据数据规模、是否有序、是否稳定408 重点八大排序的时间空间复杂度对比必考、外部排序的 IO 次数计算、最佳归并树构造。 觉得有用的话点赞 关注【张老师技术栈】吧每周更新 Java/Python/爬虫 实战干货不让你白来。
npm 8.x/9.x 依赖解析冲突:peerDependencies 版本锁定与 --legacy-peer-deps 实战解析 现代前端开发中,依赖管理一直是开发者面临的重大挑战之一。随着 npm 7.x 版本的发布,npm 团队引入了一套更为严格的依赖解析算法,这套算法在 …
📅 2026/7/12 12:41:20
1. 工业负载控制的核心挑战与方案选型在工业自动化领域,电机、电磁阀和照明设备等负载的控制一直是个棘手问题。不同于普通电子负载,这些工业设备往往具有以下特性:电感负载(如电机绕组)在断电时会产生高达数百伏的反向…
📅 2026/7/12 12:40:20
1. L9958与MKV44F256VLH16的黄金组合解析 在电机控制领域,硬件选型往往决定了系统性能的天花板。L9958作为STMicroelectronics推出的汽车级H桥驱动器,搭配NXP的MKV44F256VLH16微控制器,这套组合在工业伺服、医疗设备和精密仪器中展现出惊人的…
📅 2026/7/12 12:40:20
终极指南:VisualCppRedist AIO一键修复Windows软件兼容性问题 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist
你是否曾经在安装新游戏或专业软件时&a…
📅 2026/7/12 13:31:39
1. 工业负载控制的核心挑战与解决方案在工业自动化现场,控制电感和电阻负载从来不是简单的开关操作。我曾亲眼见过一个价值数十万的生产线因为继电器控制电路设计不当,导致反向电动势击穿整个控制系统。这种惨痛教训让我深刻认识到:工业级负载…
📅 2026/7/12 13:31:39
VS Code Spring Boot Extension Pack 2024.6:3大核心插件深度解析与实战配置
1. 为什么选择VS Code进行Spring Boot开发? 在当今快节奏的开发环境中,轻量级且高度可定制的代码编辑器正逐渐成为Java开发者的新宠。VS Code凭借其出色的性能表现…
📅 2026/7/12 13:31:39
1. 为什么“屏幕”是2026年游戏掌机唯一值得较真的维度?2026年再谈游戏掌机,已经不是“能不能玩3A”的问题,而是“愿不愿意为一块好屏多掏三百块”的问题。我从2018年第一批Switch Lite用户开始摸爬滚打,经历过Steam Deck初代OLED…
📅 2026/7/12 13:31:39
1. 为什么我们总在Excel里“卡壳”:一个从业十年的办公自动化老手的真实观察你有没有过这种经历:对着一份32列、8700行的销售明细表,想快速找出华东区上季度毛利率低于12%且退货率超5%的SKU,手指悬在键盘上,却迟迟不敢…
📅 2026/7/12 13:31:39
LeagueAkari:英雄联盟玩家的智能本地助手,如何让你的游戏体验更流畅? 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power 🚀. 项目地址: https://gitcode.com/gh_mirrors/le/League-Too…
📅 2026/7/12 13:30:39
豆包openclaw最近圈子里都在聊豆包openclaw,我也没忍住,掏腰包入手了一套。说实话,刚拿到手的时候,心里是打鼓的。毕竟市面上类似的智能硬件太多了,有的吹得天花乱坠,用起来却是一堆bug。为了不让大家的钱打水漂,我连续用了半个月。从开箱到日常高频使用,甚至故意测试它…
📅 2026/7/12 0:00:04
SQLyog 13.3.1 社区版在Windows 10/11上的完整安装与连接指南 对于刚接触MySQL数据库管理的开发者和学生来说,选择一个直观易用的图形化管理工具至关重要。SQLyog作为一款轻量级但功能强大的MySQL GUI工具,能够显著提升数据库操作的效率和体验。本文将详…
📅 2026/7/12 0:00:28
SPEC CPU 2006 跨平台基准测试深度实战:ARM/X86/MIPS 架构配置优化与结果分析方法论在当今多元化的计算架构时代,如何客观评估不同处理器平台的真实性能成为系统工程师和性能优化专家的核心挑战。SPEC CPU 2006 作为业界公认的计算密集型基准测试套件&am…
📅 2026/7/12 0:00:28
豆包openclaw最近圈子里都在聊豆包openclaw,我也没忍住,掏腰包入手了一套。说实话,刚拿到手的时候,心里是打鼓的。毕竟市面上类似的智能硬件太多了,有的吹得天花乱坠,用起来却是一堆bug。为了不让大家的钱打水漂,我连续用了半个月。从开箱到日常高频使用,甚至故意测试它…
📅 2026/7/12 0:00:04
SQLyog 13.3.1 社区版在Windows 10/11上的完整安装与连接指南 对于刚接触MySQL数据库管理的开发者和学生来说,选择一个直观易用的图形化管理工具至关重要。SQLyog作为一款轻量级但功能强大的MySQL GUI工具,能够显著提升数据库操作的效率和体验。本文将详…
📅 2026/7/12 0:00:28
SPEC CPU 2006 跨平台基准测试深度实战:ARM/X86/MIPS 架构配置优化与结果分析方法论在当今多元化的计算架构时代,如何客观评估不同处理器平台的真实性能成为系统工程师和性能优化专家的核心挑战。SPEC CPU 2006 作为业界公认的计算密集型基准测试套件&am…
📅 2026/7/12 0:00:28
目录
第一步:选对模板,省心一半
第二步:打开扫码点餐功能
开启功能按钮
桌台管理与桌码生成
第三步:个性化设计,打造品牌感
调整点餐页面
设置点餐规则 你还在让顾客站着排队点餐吗?2025年ÿ…
📅 2026/7/12 0:15:59
在业务中快速构建一个能理解私有文档、准确回答专业问题的智能助手,是很多开发团队面临的共同挑战。传统方案往往需要从零开始搭建复杂的 RAG(检索增强生成)系统,涉及文档解析、向量化、检索、大模型调用等多个环节,整…
📅 2026/7/10 22:46:54
FAE放射组学分析工具:医学影像特征探索的完整解决方案 【免费下载链接】FAE FeAture Explorer 项目地址: https://gitcode.com/gh_mirrors/fae/FAE
你是否曾经面对海量医学影像数据感到无从下手?想要从CT、MRI等影像中提取有价值的定量特征&#…
📅 2026/7/12 8:07:36