【数据结构】八大排序算法对比总结(时间/空间/稳定性)

考点频率 :★★★★★(数据结构最后一道大题常考,选择题也年年出现,是排序模块的"收官之战")

难度 :⭐⭐⭐

建议:务必熟记对比表中的所有数据,掌握"稳定性"的判断逻辑,能够根据场景选出最优算法

1️⃣ 为什么需要这张总结表?

前面我们用五篇文章分别讲解了插入、交换、选择、归并和基数排序。它们各有优缺点,没有哪一种排序是"万能"的。

软考最常考的,恰恰是"给你一个场景,让你选算法"------比如"数据量很大且要求稳定"选归并,"数据基本有序"选插入,"内存紧张"选堆排序。如果脑子里的对比表不清晰,很容易选错。

打个比方:你有一堆工具------锤子、螺丝刀、钳子、电钻。没有哪个工具是"最好"的,关键看你要拧螺丝还是钉钉子。排序算法也是一样,看数据特征选工具。

2️⃣ 八大排序算法全景对比表(核心,务必熟记)

排序算法 平均时间复杂度 最好情况 最坏情况 空间复杂度 稳定性 一句话核心特征
插入排序 O(n2)O(n^2)O(n2) O(n)O(n)O(n) O(n2)O(n^2)O(n2) O(1)O(1)O(1) 稳定 数据基本有序时最快
希尔排序 O(n1.3)O(n^{1.3})O(n1.3) O(n)O(n)O(n) O(n2)O(n^2)O(n2) O(1)O(1)O(1) ❌ 不稳定 插入排序的"跳跃版"
冒泡排序 O(n2)O(n^2)O(n2) O(n)O(n)O(n) O(n2)O(n^2)O(n2) O(1)O(1)O(1) 稳定 相邻比较,大的冒泡
快速排序 O(nlog⁡n)O(n \log n)O(nlogn) O(nlog⁡n)O(n \log n)O(nlogn) O(n2)O(n^2)O(n2) O(log⁡n)O(\log n)O(logn) ❌ 不稳定 平均最快,基准决定效率
简单选择 O(n2)O(n^2)O(n2) O(n2)O(n^2)O(n2) O(n2)O(n^2)O(n2) O(1)O(1)O(1) ❌ 不稳定 每轮找最小,与初始顺序无关
堆排序 O(nlog⁡n)O(n \log n)O(nlogn) O(nlog⁡n)O(n \log n)O(nlogn) O(nlog⁡n)O(n \log n)O(nlogn) O(1)O(1)O(1) ❌ 不稳定 建堆 O(n)O(n)O(n),排序 O(nlog⁡n)O(n \log n)O(nlogn)
归并排序 O(nlog⁡n)O(n \log n)O(nlogn) O(nlog⁡n)O(n \log n)O(nlogn) O(nlog⁡n)O(n \log n)O(nlogn) O(n)O(n)O(n) 稳定 分治合并,需要额外空间
基数排序 O(d(n+r))O(d(n+r))O(d(n+r)) O(d(n+r))O(d(n+r))O(d(n+r)) O(d(n+r))O(d(n+r))O(d(n+r)) O(n+r)O(n+r)O(n+r) 稳定 不比较大小,按位分配

3️⃣ 稳定性记忆:一招分清"稳定"与"不稳定"

稳定的排序算法 (记住这4个):插入、冒泡、归并、基数

不稳定的排序算法 (剩下4个):希尔、选择、堆、快速

3.1 为什么这些是不稳定的?(软考常考理由)

不稳定算法 导致不稳定的根本原因
希尔排序 分组跳跃式交换,不同组的相同元素可能被交换到不同位置
简单选择排序 跨位置交换(如把后面的最小元素换到前面),可能破坏相等元素的相对顺序
堆排序 堆顶与堆尾交换,是跨区域的"长距离"交换
快速排序 划分时跨越式交换(从左找大、从右找小),打乱了原始顺序

3.2 为什么这些是稳定的?

稳定算法 保证稳定的原因
插入排序 只在相邻位置间移动,且相等时不交换(> 而非 >=
冒泡排序 只在相邻位置交换,且相等时不交换(> 而非 >=
归并排序 合并时,相等时优先取左半部分的数据
基数排序 分配收集过程不改变同值元素的相对顺序

4️⃣ 时间复杂度细节剖析(易混淆点)

4.1 哪些算法与初始顺序无关?

算法 与初始顺序的关系 说明
简单选择排序 无关 无论有序还是无序,比较次数始终为 n(n−1)/2n(n-1)/2n(n−1)/2
归并排序 无关 始终将序列对半分割,比较次数固定
堆排序 无关 建堆和调整的复杂度相对稳定
基数排序 无关 只按位分配,不依赖顺序

4.2 哪些算法在数据有序时表现极好?

算法 最好情况 触发条件
插入排序 O(n)O(n)O(n) 序列已经有序或基本有序
冒泡排序 O(n)O(n)O(n) 序列已经有序(优化版一轮无交换就停)

注意 :快速排序在数据已经有序时,如果每次选第一个元素做基准,会退化为 O(n2)O(n^2)O(n2)(最坏情况)。

5️⃣ 空间复杂度分析

算法 空间复杂度 说明
原地排序 (O(1)O(1)O(1)) 插入、希尔、冒泡、快速(递归栈除外)、选择、堆 仅需几个临时变量
归并排序 O(n)O(n)O(n) 合并时需要额外数组存放临时数据
快速排序 O(log⁡n)O(\log n)O(logn) 递归调用栈的深度(平均情况)
基数排序 O(n+r)O(n+r)O(n+r) 桶的空间(rrr 为基数,通常为10)

考点 :问"哪个排序算法需要额外空间最多?"------归并排序 (O(n)O(n)O(n))。问"哪个是原地排序且不稳定?"------堆排序快速排序

6️⃣ 场景选型指南(软考高频应用题)

应用场景 推荐算法 理由
数据量小(n<50n < 50n<50) 插入排序 实现简单,常数因子小
数据基本有序 插入排序 / 冒泡排序 时间复杂度接近 O(n)O(n)O(n)
数据量大、要求稳定 归并排序 O(nlog⁡n)O(n \log n)O(nlogn) 且稳定
数据量大、内存充足、稳定 归并排序 稳定且高效
数据量大、内存紧张 堆排序 O(1)O(1)O(1) 空间,O(nlog⁡n)O(n \log n)O(nlogn) 时间
数据量大、平均性能要求最高 快速排序 平均情况下最快的内部排序
数据有固定位数(如学号、身份证) 基数排序 O(d(n+r))O(d(n+r))O(d(n+r)),不依赖比较
数据量大且不要求稳定 快速排序 / 堆排序 效率高,不要求稳定性

7️⃣ 经典例题

例题1 :若对 nnn 个元素进行排序,要求排序算法的时间复杂度为 O(nlog⁡n)O(n \log n)O(nlogn),且排序过程中需要的辅助存储空间为 O(1)O(1)O(1),则应选择的算法是( )。

A. 快速排序

B. 归并排序

C. 堆排序

D. 基数排序

解析

  • 快速排序平均 O(nlog⁡n)O(n \log n)O(nlogn),但空间为 O(log⁡n)O(\log n)O(logn)(递归栈)
  • 归并排序空间为 O(n)O(n)O(n)
  • 基数排序空间为 O(n+r)O(n+r)O(n+r)
  • 堆排序:时间 O(nlog⁡n)O(n \log n)O(nlogn),空间 O(1)O(1)O(1) ✅

C


例题2:某系统需要对100万个学生记录按学号排序,学号为8位数字。内存空间充足,要求排序算法稳定。以下哪种算法最适合?

A. 快速排序

B. 归并排序

C. 基数排序

D. 堆排序

解析 :学号是8位数字,固定长度 → 适合基数排序 。基数排序的时间复杂度为 O(8×(n+10))≈O(n)O(8 \times (n+10)) \approx O(n)O(8×(n+10))≈O(n),远优于其他 O(nlog⁡n)O(n \log n)O(nlogn) 的算法,且稳定。选 C

8️⃣ 易错点汇总

易错点 正确理解
快速排序在所有情况下都快 ❌ 最坏情况 O(n2)O(n^2)O(n2)(数据已有序且基准选第一个时)
堆排序和归并排序都是稳定的 ❌ 堆排序不稳定 ,归并排序稳定
希尔排序是稳定的 ❌ 希尔排序不稳定(分组跳跃交换导致)
基数排序需要比较元素大小 ❌ 基数排序不比较大小,按位分配
选择排序的最好情况是 O(n)O(n)O(n) ❌ 选择排序最好、最坏、平均都是 O(n2)O(n^2)O(n2)
冒泡排序总是 O(n2)O(n^2)O(n2) ❌ 优化版冒泡在数据有序 时是 O(n)O(n)O(n)
归并排序是原地排序 ❌ 归并排序需要 O(n)O(n)O(n) 额外空间

9️⃣ 记忆口诀

稳定性口诀

插冒归基 (稳定)

快选堆希(不稳定)

时间复杂度口诀

选泡插 是 O(n2)O(n^2)O(n2),快归堆 是 O(nlog⁡n)O(n \log n)O(nlogn)。

基数 要看位数 ddd,插入冒泡有序快。

场景选型口诀

基本有序 用插入,大量数据 用快排。

要求稳定 用归并,内存紧张 用堆排。

固定位数 用基数,数据量小插入来。

🔟 小测验(评论区对答案)

某系统需要对10万个整数进行升序排序,要求排序算法稳定且尽可能快,内存限制较宽松。最适合的算法是( )。

A. 快速排序

B. 归并排序

C. 堆排序

D. 冒泡排序

🔔 本专栏日更,点击头像 → 专栏《软考中级高频考点》订阅,第一时间接收新内容

#软考中级 #软件设计师 #排序算法 #时间复杂度 #稳定性 #数据结构 #软考备考

相关推荐
selia10781 小时前
AI手撕代码笔记
人工智能·笔记·深度学习
一只旭宝1 小时前
预约系统版本2(pyhton+flask可视化版本)
服务器·数据库·c++·笔记·python·flask
树獭哥1 小时前
量化金融入门:从数据规则到随机游走与凯利公式
人工智能·算法·金融·量化金融
蒲锘1 小时前
DevOps 实验项目笔记三 —— Kubernetes 集群部署阶段
笔记·kubernetes·devops·rbac
米饭不加菜2 小时前
C51 语言参考手册
经验分享·笔记·单片机·嵌入式硬件
薛定e的猫咪2 小时前
(arXiv 2026)GLiBRL :可学习基函数的深度贝叶斯元强化学习 ----待补充
人工智能·深度学习·学习·算法·机器学习
sunshine22 girl2 小时前
Angular7,9,学习笔记一 创建项目,基本语法
笔记·学习
hetao17338372 小时前
2026-08-21~23 hetao1733837 的刷题记录
c++·算法