Lazy loaded image
技术分享
Python3 常见排序及其复杂度分析
Words 1908Read Time 5 min
2026-3-12
2026-3-13
type
Post
status
Published
date
Mar 12, 2026
slug
summary
tags
刷题
category
技术分享
icon
password
😀
这里写文章的前言: 一个简单的开头,简述这篇文章讨论的问题、目标、人物、背景是什么?并简述你给出的答案。
可以说说你的故事:阻碍、努力、结果成果,意外与转折。
 

对比

排序的稳定性(归并/冒泡/插入稳定,快排/堆排/选择不稳定)、时间复杂度空间复杂度是面试必问的配套知识点。
稳定性:在排序过程中,值相等的元素经过排序后,依然保持它们在原始数组中的相对先后位置,这种排序算法就是稳定的,反之则不稳定
排序算法
稳定性
时间复杂度(最好)
时间复杂度(最坏)
时间复杂度(平均)
空间复杂度
核心备注(面试考点)
快速排序
不稳定
O(nlogn)
O(n2)
O(nlogn)
O(logn)
面试最高频;最坏场景为有序数组,需选基准
归并排序
稳定
O(nlogn)
O(nlogn)
O(nlogn)
O(n)
分治思想;合并有序数组是核心手写考点
堆排序
不稳定
O(nlogn)
O(nlogn)
O(nlogn)
O(1)
原地排序;需理解堆化、最大堆构建逻辑
冒泡排序
稳定
O(n)
O(n2)
O(n2)
O(1)
优化点:标记交换,无交换则提前终止
选择排序
不稳定
O(n2)
O(n2)
O(n2)
O(1)
选最值交换;易理解但效率低,无最好优化
插入排序
稳定
O(n)
O(n2)
O(n2)
O(1)
适合近乎有序数组;局部有序思想
为什么快速排序是「原地排序」仍然有空间复杂度? 快速排序的空间消耗核心是递归调用栈,平均O(logn)、最坏O(n),这是分治递归的必然结果;
除归并排序外,其余 5 种排序算法均为「原地排序」
原地排序的 O (nlogn) 算法? 快速排序和堆排序。(他们俩都不稳定)
是否存在 O (nlogn)、原地且稳定的排序? 理论上存在(如 Block Sort),但非经典算法,实际开发 / 刷题中不用。
Python里.sort()等是什么排序?,业界一般用哪个? Timsort(蒂姆排序)是工业界最主流、最万金油的排序算法 —— 它是 Python list.sort()/sorted()、Java Arrays.sort()(针对对象数组)、Android、Chrome 等核心场景的默认排序实现。
 

进阶排序 O(nlogn)

1. 快速排序(面试最高频,分治思想)

核心特点:平均时间复杂度O(nlogn),「原地」排序,非稳定;面试必问“基准值选择”“分区逻辑”。

2. 归并排序(分治+稳定,面试常考)

核心特点:稳定排序,时间复杂度O(nlogn),需要「额外空间」;核心是“分-合”两步。

3. 堆排序(基于堆结构,关联优先队列)

核心特点:O(nlogn),「原地」排序,非稳定;面试常和heapq结合考察。

 

基础排序 O(n²)

4. 冒泡排序(基础,理解交换思想)

核心特点:O(n²),稳定排序,原地操作;面试常问“如何优化(提前终止)”。

5. 选择排序(基础,选择最值思想)

核心特点:O(n²),非稳定,原地排序;核心是“找最小值放到已排序区末尾”。

6. 插入排序(基础,局部有序思想)

核心特点:O(n²),稳定排序,原地操作;适合近乎有序的数组,面试常问“优化(希尔排序)”。

扩展阅读

经典排序为何成很少在工业界直接应用?

排序算法
工业界不适用的核心原因
快速排序
不稳定,最坏 O (n²)(极端数据易超时),业务场景易踩坑
归并排序
非原地(空间 O (n)),内存开销大,不适合大数据量
堆排序
不稳定,对 CPU 缓存不友好(实际运行效率低),仅适合特定场景(如优先队列)
冒泡 / 插入 / 选择
O (n²) 时间复杂度,仅小数据量可用,无工业级价值
👌
Timsort 的工业级完整实现难度极高,远超出普通开发者(甚至面试)的要求;但理解其核心思路很简单,完全不需要手写完整版本
上一篇
Python3 ACM模式常用库import方式汇总
下一篇
为什么Transformer中位置编码前要将Embedding乘以根号d