python的list.sort()和sorted()是稳定排序,即相等元素的相对位置在排序后保持不变;其稳定性源于cpython采用的timsort算法,该算法通过归并已排序片段且仅用“小于”比较来保证顺序不被扰动。

Python 的 list.sort() 和 sorted() 都是稳定排序,也就是说:相等元素的相对位置在排序后不会改变。
什么是排序稳定性?
稳定性指当多个元素具有相同排序键(key)时,它们在原列表中的先后顺序会被保留。例如:
原列表:[('a', 2), ('b', 1), ('c', 2), ('d', 1)]按第二个元素(数字)升序排序后:
[('b', 1), ('d', 1), ('a', 2), ('c', 2)]注意:'b' 在 'd' 前,'a' 在 'c' 前 —— 原顺序被完整保留。
Python 为什么能保证稳定?
CPython 实现中,list.sort() 使用的是Timsort算法,它本身就是一种稳定的归并排序变体。关键设计包括:
- Timsort 将输入划分为若干“已排序片段”(runs),再通过归并合并;归并过程天然保持相等元素的原始次序
- 所有比较操作只判断“小于”,不使用“大于”或“不等于”,避免因等价判断引入顺序扰动
- C 标准库未被调用,整个排序逻辑由 Python 自己控制,不受底层不可控行为影响
稳定性在实际中有什么用?
稳定排序让多级排序变得简单可靠,无需嵌套复杂 key 函数:
立即学习“Python免费学习笔记(深入)”;
- 先按姓名排序,再按分数降序?可以反向操作:先按分数排,再按姓名排 —— 稳定性保证同分者姓名顺序不变
- 处理带时间戳的日志数据,想按状态分组、组内按时间先后展示?稳定排序可避免打乱原始采集顺序
- 实现“插入排序式”的在线排序(如 UI 列表动态更新),稳定性有助于视觉连贯性
哪些情况会破坏稳定性?
稳定性只在比较逻辑一致且不修改原对象状态的前提下成立:
- 自定义
key函数若返回可变对象(如 list、dict),且过程中修改了它,可能导致意外行为 - 使用
cmp参数(Python 2 风格)已被移除,现代 Python 不支持该用法 - 若排序过程中其他线程/协程并发修改同一列表,结果不可预测(但这属于并发问题,非排序算法本身)










