← 返回软件技术总览 软件技术 · 知识点深化 · 排序全家族对比:冒泡/快排/归并/堆排/基数
知识点深化 · 数据结构 · 排序

排序全家族对比:冒泡/快排/归并/堆排/基数

排序是面试必考题。冒泡 O(n²) 慢但好懂;快排 O(n log n) 平均最快;归并稳定 O(n log n);堆排 O(n log n) 原地不占额外空间;桶/基数排接近 O(n)。这一页把时间空间稳定性和适用场景一张表讲透。

① 小白第一课怎么学(4 步走,约 60 分钟)

别急着背代码,先按这四步建立直觉:

1看图建立直觉(10 分钟)
读②③:对比各排序思路。
2记复杂度表(15 分钟)
读④:背大表。
3手推快排(20 分钟)
精读⑤:分区过程。
4刷题纠错(15 分钟)
做⑦⑩,错题回⑥。
本课小目标学完你要能:① 说出各排序时间/空间/稳定性;② 手推快排分区;③ 根据场景选排序。

② 一图看懂:排序算法全地图

排序算法 冒泡/选择/插入 O(n²) 稳定/不稳 快速排序 平均 O(n log n) 不稳 归并排序 O(n log n) 稳定 堆排序 O(n log n) 原地 桶/基数排序 O(n) 非比较 稳定:冒泡/插入/归并/基数 工程用快排变体 易错:稳定性记混 快排最坏 O(n²)
读法:中心是排序,各家族并列,对比复杂度与稳定性,下方是应用与易错。

③ 本质直觉:排序就是让元素"各就各位",不同策略代价不同

冒泡:相邻两两比,大的往后冒,每轮冒出一个最大值。慢但好写。

快排:选一个基准 pivot,把比它小的放左、大的放右(分区),再递归排左右。平均 O(n log n),实际最快。

归并:先对半分到底,再把两个有序小数组合并成大数组。稳定,O(n log n),但要 O(n) 额外空间。

堆排:建大顶堆,反复把堆顶最大值换到末尾。原地 O(n log n),但不稳定。

快排分区(pivot 选末元素 3) [5, 2, 4, 7, 1, 3] 小的→左:2 1 3 | 5 7 4 递归后:[1,2,3,4,5,7] 快排平均最快,但最坏 O(n²) 归并稳定但要额外数组 稳定性:相等元素相对顺序不变
什么是稳定性排序后相等元素的相对顺序不变就是稳定。如按分数排序,同分的两人原先后顺序不变。冒泡、插入、归并、基数稳定;快排、选择、堆排不稳定。

④ 完整体系与对比表

排序算法总表(必背)

算法平均最坏空间稳定
冒泡O(n²)O(n²)O(1)是
选择O(n²)O(n²)O(1)否
插入O(n²)O(n²)O(1)是
快排O(n log n)O(n²)O(log n)否
归并O(n log n)O(n log n)O(n)是
堆排O(n log n)O(n log n)O(1)否
基数/桶O(n)O(n)O(n+k)是

快排分区思想

选 pivot(常取末元素),用指针 i 记录"小于 pivot 区"的末尾。遍历 j:若 arr[j]<pivot,i++ 并交换 arr[i]、arr[j]。最后交换 arr[i+1] 与 pivot。一轮后 pivot 归位,左右递归。

快排时间平均 O(n log n);若每次 pivot 选到极值(如已排序数组取末位),退化为 O(n²)

⑤ 用法场景与典型例题

例1(稳定性)快排为什么不稳定?
相等元素可能被 pivot 交换到对面。
分区时把等于 pivot 的元素随意划到左/右,相同值的相对顺序可能改变。答案:不稳定。
例2(选排序)要稳定且数据量极大,选?
归并稳定且 O(n log n)。
需要稳定 → 冒泡/插入/归并/基数;数据量大 → O(n²) 的冒泡插入太慢。答案:归并排序(牺牲 O(n) 空间换稳定)。
例3(快排最坏)已排序数组用末位做 pivot,复杂度?
每次分区极不均匀。
pivot 总是最大/最小,分成 0 和 n−1,递归树偏斜,总 O(n²)。对策:随机选 pivot 或三数取中。
做题心法先问要不要稳定,再问数据量。要稳定大数据选归并;要快且不care稳定选快排;要省空间选堆排。

⑥ 高频错误诊断(4 条)

错误1:把快排当 O(n log n) 最坏快排最坏 O(n²)(已排序+坏 pivot),只是平均快。
错误2:稳定性记混记住:快排、选择、堆排不稳定;冒泡、插入、归并、基数稳定。
错误3:归并不占额外空间归并合并要 O(n) 临时数组,不是原地。
错误4:基数排序适用于一切基数/桶排序只对整数/小范围键有效,是非比较排序,有前提。

⑦ 考点真题演练(4 题)

考点分布

考法出题形式应对
复杂度问平均/最坏背总表
稳定性问哪个稳定归并冒泡插入基数
快排最坏什么情况 O(n²)已排序+坏 pivot
选型按场景选算法稳定大数据→归并

真题基础1. 下列哪个排序是稳定的?

真题中档2. 快速排序的平均时间复杂度是?

真题中档3. 归并排序相比快排的主要特点是?

真题拔高4. 对已排序数组用末位元素做 pivot 快排,复杂度退化为?

⑧ 必背知识点卡

冒泡:相邻交换,O(n²) 稳定
快排:分区递归,平均 O(n log n) 不稳 最坏 O(n²)
归并:分半再合并,O(n log n) 稳定 O(n) 空间
堆排:大顶堆换末尾,O(n log n) 原地 不稳
基数/桶:非比较,O(n) 整数小范围
稳定:冒泡 插入 归并 基数 相等保序
选型:稳定大数据归并,要快选快排 省空间堆排

⑨ 应用输出:给一亿条订单按金额排序

场景:日志系统有一亿条订单记录,要按金额排序输出。
① 分析:数据量大,内存可能放不下,要外部排序。
② 选型:归并排序天然适合外部排序——分块读入内存排好落盘,再多路归并。
③ 稳定性:若金额相同要保持原先后顺序,归并稳定正好满足。
④ 工程实现:外部归并 = 分片排序 + 优先队列多路合并。
⑤ 若数据能全装内存:直接用系统自带 sort(底层快排变体)即可。
口述思路合上书说:"大数据外部排序用归并,分片排好再多路合并。"

⑩ 分层练习(基础 + 中档 + 拔高)

▍基础 6 题

基础1快排平均复杂度?
O(n log n)。
基础2归并排序稳定吗?
稳定。
基础3冒泡排序复杂度?
O(n²)。
基础4堆排空间复杂度?
O(1) 原地。
基础5稳定排序有哪些?
冒泡、插入、归并、基数。
基础6非比较排序是哪个?
基数/桶排序。

▍中档 6 题

中档7快排最坏复杂度?
O(n²)。
中档8归并排序额外空间?
O(n)。
中档9为什么要稳定排序?
多关键字排序时保序(先按次关键字再按主关键字)。
中档10插入排序对 nearly-sorted 数据复杂度?
接近 O(n),因为几乎有序。
中档11堆排和快排哪个原地?
都是 O(1)/O(log n),堆排原地更省。
中档12桶排序适用条件?
数据均匀分布在小范围,可分到桶里。

▍拔高 6 题

拔高13为什么快排实际比归并/堆排快?
缓存友好(分区局部性好),常数小。
拔高14三路快排解决什么?
大量重复元素时把等于 pivot 的单独放中间,避免重复递归。
拔高15外部排序用什么?
归并:分片排序 + 多路归并。
拔高16TimSort 是什么?
归并+插入的混合,Python/Java 对象排序默认,利用已有有序段。
拔高17比较排序下界?
O(n log n),因为比较树叶子数 n!。
拔高18TopK 为什么用堆不用全排序?
只要 K 个最值,O(n log K) 更省。

⑪ 记忆口诀 + 7 天复习计划

三句口诀① 冒泡插入 O(n²),快排归并堆排 O(n log n)。② 稳定归并冒泡插入基数,快排堆排不稳定。③ 快排最坏已排序 O(n²),大数据外部排序用归并。
天任务自检
第 1 天读②③④,背排序总表复杂度全对
第 2 天背稳定性 + 基础 1-6稳定的记牢
第 3 天做中档 7-12,手推快排分区pivot 归位对
第 4 天做拔高 13-18,理解外部排序能讲清归并多路
第 5 天做⑦真题 4 题限时每题 2 分钟
第 6-7 天合上书默写排序总表不看资料全默对

← 返回软件技术总览