408数据结构第8章:排序②——性质对比秒杀、场景选择与外部排序
这一篇不再详细讲过程重点解决408选择题复杂度、稳定性、空间、初始状态影响、适用场景、外部排序。一、先看408最重要总表排序算法最好平均最坏空间稳定性直接插入O(n)O(n²)O(n²)O(1)稳定折半插入O(n²)*O(n²)O(n²)O(1)稳定希尔与增量有关与增量有关可到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(nr)稳定说明折半插入虽然比较次数可降到O(n log n) 但元素移动仍可能O(n²)所以整体仍是O(n²)。二、稳定性秒杀表稳定直接插入 折半插入 冒泡 归并 基数不稳定希尔 快速 简单选择 堆可以记成稳定插冒归基 不稳定希快选堆其中“插”包括直接插入 折半插入三、哪些算法最受初始序列影响直接插入非常受影响。基本有序 - 很快 O(n) 逆序 - O(n²)冒泡也受影响。带提前结束标志时已经有序 - O(n)快速排序非常受pivot和初始序列影响。如果固定选首元素基本有序 / 逆序 - 可能退化到O(n²)简单选择几乎不受初始序列影响。因为每趟都必须扫描整个未排序区间找最小比较次数始终n(n-1)/2堆排序、归并排序时间复杂度较稳定都是O(n log n)四、408场景选择秒杀场景1序列基本有序优先直接插入 冒泡带提前结束最典型直接插入场景2n很小优先直接插入原因实现简单 常数小场景3要求稳定可考虑插入 冒泡 归并 基数场景4要求最坏仍O(n log n)优先堆排序 归并排序不要选快速排序。场景5要求额外空间尽量小可考虑堆排序 O(1)归并O(n)空间更大。场景6大量数据在外存优先归并思想即外部排序 - 多路归并场景7链表排序更适合归并排序因为链表不适合随机访问但归并只需要顺序扫描。五、比较排序的下界如果排序算法只通过比较关键字大小来确定顺序那么平均意义下至少需要Ω(n log n)级别的比较。因此比较排序不可能普遍做到O(n)但基数排序 计数排序 桶排序不完全依赖关键字比较所以可以突破这个限制。六、快排、堆排、归并三大重点横向对比对比快速排序堆排序归并排序平均时间O(n log n)O(n log n)O(n log n)最坏时间O(n²)O(n log n)O(n log n)空间递归栈O(1)O(n)稳定否否是初始序列影响大小小核心操作划分堆调整合并典型优势平均很快最坏稳定、空间小稳定、适合外排408里如果三者放一起比较重点看稳定性 最坏复杂度 空间七、交换次数和比较次数常考结论简单选择排序比较次数n(n-1)/2与初始序列无关。交换次数最多n-1次冒泡排序逆序情况下交换次数最多交换次数等于逆序对数量这是一个很重要的结论。插入排序元素移动量也和逆序对数量高度相关。序列越接近有序插入排序越快八、堆排序的高频计算1. 建大根堆升序时父结点 孩子从最后一个非叶子结点开始向前调整。若n个元素从1开始编号最后一个非叶子结点 floor(n/2)所以建堆时i floor(n/2), ..., 1依次向下调整。2. 每趟输出升序排序堆顶最大把堆顶 - 当前最后元素交换。然后堆大小减1 重新向下调整根九、归并排序的高频计算如果有n个元素每次二路归并归并趟数 ceil(log2 n)例如n 10则ceil(log2 10) 4需要4趟二路归并。每一趟处理全部n个元素因此O(n log n)十、外部排序先理解为什么需要它如果数据太大内存一次装不下就只能磁盘 - 内存反复读写。这叫外部排序外部排序最重要的成本不是CPU比较而是磁盘I/O次数因此目标尽量减少归并趟数十一、外部排序标准流程第一步生成若干初始归并段 第二步对这些归并段进行多路归并 第三步不断归并直到只剩一个有序文件十二、多路归并趟数公式设r 初始归并段数量 k k路归并则归并趟数约为ceil(log_k r)例如16个初始归并段 2路归并需要log2 16 4趟如果改成4路归并则log4 16 2趟所以归并路数越大 归并趟数越少 I/O次数越少十三、败者树是干什么的多路归并时每一轮都要从k个归并段当前元素中找最小值。如果每次普通扫描比较成本较高败者树用于快速从k路中找当前最小元素本质上减少CPU比较次数注意败者树本身不会直接减少归并趟数归并趟数主要取决于初始归并段数量r 归并路数k十四、如何减少外部排序I/O两个最重要方向方法1增大归并路数kk越大 log_k r越小 归并趟数越少方法2减少初始归并段数量r也就是让每个初始归并段更长常见技术置换-选择排序它可以生成比内存容量更长的初始归并段。十五、排序算法“第一反应”表看到题目关键词直接联想基本有序 - 直接插入 每趟最大值到末尾 - 冒泡 pivot归位 - 快速 每趟选最小值 - 简单选择 大根堆/小根堆 - 堆排序 两个有序段合并 - 归并 个位十位百位 - 基数 外存、磁盘I/O - 多路归并十六、稳定性怎么判断判断一个排序是否稳定只看两个关键字相同的元素 排序前后相对顺序会不会被颠倒例如5a 3 5b排序后如果3 5a 5b稳定。如果可能3 5b 5a则不稳定。十七、408选择题最常见陷阱1. 快速排序最快所以任何时候都最好错。最坏O(n²) 不稳定 递归需要额外空间2. 折半插入排序是O(n log n)错。比较少了 移动仍然O(n²)3. 堆排序稳定错。不稳定4. 归并排序空间O(1)错。数组上的二路归并一般需要O(n)辅助空间。5. 简单选择排序在原序列有序时会变快错。比较次数基本不变。6. 希尔排序稳定错。不稳定十八、考前1分钟总表直接插入 稳定O(n²)基本有序最好O(n) 折半插入 稳定比较少整体仍O(n²) 希尔 不稳定原地 冒泡 稳定O(n²)最好O(n) 快速 不稳定平均O(nlogn)最坏O(n²)pivot归位 简单选择 不稳定始终O(n²)比较次数固定 堆 不稳定O(nlogn)O(1)空间 归并 稳定O(nlogn)O(n)空间 基数 稳定非比较排序O(d(nr))十九、强化阶段你最需要练什么排序这一章不建议平均用力。优先级第一档 快速排序 堆排序 归并排序 第二档 直接插入 冒泡 简单选择 第三档 希尔 基数 外部排序每种算法至少练两类题1. 给初始序列问一趟之后结果 2. 给性质判断稳定性/复杂度/适用场景二十、回去复习的位置408数据结构 - 第8章 排序 - 8.1 基本概念 - 插入排序 - 交换排序 - 选择排序 - 归并排序 - 基数排序 - 外部排序 - 排序算法分析与应用最后真正要做到的是看到序列变化 - 认算法 看到场景 - 选算法 看到性质 - 秒判断

相关新闻

DeepSeek    LeetCode 3855. 给定范围内 K 位数字之和 Python3实现

DeepSeek LeetCode 3855. 给定范围内 K 位数字之和 Python3实现

这道题本质上是一个组合数学问题,可以直接通过数学公式高效解决,无需遍历。解题思路每个数的每一位都独立地从 [l, r] 中选择,因此每一位的贡献是独立的。一个 k 位数 d_{k-1}...d_1d_0 可以表示为: 数字和 Σ(d_i 10^i)&#x…

2026/10/25 18:13:38 阅读更多 →
OpenClaw与Qwen-Max大模型用量监控系统搭建实战

OpenClaw与Qwen-Max大模型用量监控系统搭建实战

1. OpenClaw与Qwen-Max用量记录系统搭建指南 最近在部署OpenClaw对接Qwen-Max大模型时,发现官方文档对用量监控部分着墨不多。作为企业级AI应用的关键环节,用量记录不仅关乎成本核算,更是优化资源配置的重要依据。本文将分享我通过OpenClaw C…

2026/10/21 8:55:41 阅读更多 →
混合储能系统Simulink建模与能量管理策略优化

混合储能系统Simulink建模与能量管理策略优化

1. 混合储能系统概述:电池与超级电容的黄金组合 在新能源发电、电动汽车和智能电网领域,储能系统的动态响应能力和循环寿命始终是工程师们面临的痛点。传统锂电池虽然能量密度高,但大电流充放电时容量衰减快;超级电容功率密度出色…

2026/10/24 11:07:01 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年,我大部分时间都在跟浏览器标签页打交道,直到第一次把桌面应用跑起来,才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词,最开始是在某段时间频繁出现在同事的讨论里,一个用HTML…

2026/10/26 12:00:21 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介:亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档,主要面向智能锁安装人员、终端用户及售后维护者,帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件,大小4.37MB,内容结构清晰&#xff…

2026/10/27 4:06:49 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统,整车要求空载跑到8m/s,电机转速已经拉到额定点,驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令,转速纹丝不动,三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/10/27 7:21:53 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年,用它写过嵌入式驱动、做过游戏服务端,也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词,我其实挺感慨的——这门语言的难点从来不是语法多,而是知识点之间的耦合太深…

2026/10/26 12:00:21 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介:亚太天能T109滑盖智能锁产品说明书以PDF格式发布,适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开,先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能,再给出完整安装步骤&…

2026/10/27 6:20:47 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历:翻开源码注释、论文摘要或者一份专业报告,每个字都认识,连在一起却像天书。想找人聊聊,身边要么没人懂,要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型,几秒钟之后&a…

2026/10/27 4:06:50 阅读更多 →

日新闻

周新闻

月新闻

我发现了一个新思路:用 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/27 13:55:19 阅读更多 →
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/27 7:21:50 阅读更多 →
黑夜航拍船只数据集训练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/26 8:34:37 阅读更多 →