news 2026/5/8 19:30:12

【数据结构与算法】第36篇:排序大总结:稳定性、时间复杂度与适用场景

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【数据结构与算法】第36篇:排序大总结:稳定性、时间复杂度与适用场景

目录

一、十大排序算法总览

二、稳定性详解

2.1 什么是稳定性

2.2 什么时候需要稳定性

2.3 各算法稳定性原因

三、时间复杂度分析

3.1 增长曲线对比

3.2 实际运行时间参考(n=50000随机数据)

四、空间复杂度分析

五、场景选型指南

5.1 数据规模小(n < 1000)

5.2 数据规模中等(1000 < n < 50000)

5.3 数据规模大(n > 50000)

5.4 特殊场景

六、混合排序(工业级实现)

七、面试高频考点

7.1 手写代码常考

7.2 概念常考

八、快速对比卡片

O(n²) 级(适合小数据)

O(n log n) 级(工业标准)

O(n) 级(特殊场景)

九、小结

十、思考题


一、十大排序算法总览

算法分类时间复杂度(平均)时间复杂度(最坏)时间复杂度(最好)空间复杂度稳定性
冒泡排序交换O(n²)O(n²)O(n)O(1)稳定
快速排序交换O(n log n)O(n²)O(n log n)O(log n)不稳定
直接插入排序插入O(n²)O(n²)O(n)O(1)稳定
希尔排序插入O(n^1.3)O(n²)O(n log n)O(1)不稳定
简单选择排序选择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(n+k)O(n+k)O(n+k)O(k)稳定
桶排序非比较O(n+k)O(n²)O(n)O(n+k)稳定
基数排序非比较O(d×(n+k))O(d×(n+k))O(d×(n+k))O(n+k)稳定

k表示数据范围(如计数排序中最大值与最小值的差),d表示位数(基数排序中)


二、稳定性详解

2.1 什么是稳定性

稳定排序:相等的元素在排序前后相对位置不变。

text

原数组:[(2,A), (1,B), (2,C)] // 数字为键,字母为附加信息 稳定排序后:[(1,B), (2,A), (2,C)] // 两个2的相对顺序不变 不稳定排序后:[(1,B), (2,C), (2,A)] // 顺序可能改变

2.2 什么时候需要稳定性

场景说明
多关键字排序先按A排序,再按B排序,稳定性能保留A的顺序
业务数据排序用户列表按时间排序后,再按地区排序,同地区内时间顺序不变
多次排序后续排序需要保留之前的排序结果

2.3 各算法稳定性原因

算法稳定性原因
冒泡排序稳定相邻交换,相等时不交换
插入排序稳定相等元素不移动
归并排序稳定合并时相等取左边
计数/桶/基数排序稳定按顺序分配收集
快速排序不稳定分区时可能跨过相等元素
希尔排序不稳定分组排序,不同组间顺序打乱
选择排序不稳定交换可能把后面的相等元素换到前面
堆排序不稳定堆化过程无法保证顺序

三、时间复杂度分析

3.1 增长曲线对比

text

n=1000时各算法大致比较次数: O(n): 1000 O(n log n): 1000 × 10 = 10000 O(n²): 1000000 n=1000000时: O(n): 1000000 O(n log n): 1000000 × 20 = 20000000 O(n²): 1000000000000(无法接受)

3.2 实际运行时间参考(n=50000随机数据)

算法时间(ms)量级
快速排序~8最快
归并排序~12很快
堆排序~15很快
希尔排序~20中等
基数排序~25中等(依赖数据范围)
冒泡/插入/选择~2000+

注:数据因机器而异,但相对关系类似


四、空间复杂度分析

算法额外空间是否原地
冒泡/插入/选择/希尔/快排/堆排O(1)
归并排序O(n)
计数排序O(k)
桶排序O(n+k)
基数排序O(n+k)

内存受限场景:优先选择原地排序算法。


五、场景选型指南

5.1 数据规模小(n < 1000)

场景推荐理由
基本有序插入排序时间复杂度O(n)
无特殊要求插入排序代码简单,稳定性好
需要稳定冒泡/插入稳定且简单

5.2 数据规模中等(1000 < n < 50000)

场景推荐理由
通用场景快速排序平均最快
需要稳定归并排序O(n log n)稳定
内存紧张堆排序原地O(n log n)
数据基本有序插入排序退化为O(n)

5.3 数据规模大(n > 50000)

场景推荐理由
通用场景快速排序常数因子小
需要稳定归并排序唯一稳定O(n log n)
内存极度紧张堆排序原地排序
数据范围小计数/基数排序可达到O(n)

5.4 特殊场景

场景推荐理由
整数且范围小计数排序O(n+k),k很小时极快
整数且范围大基数排序O(d×n),d通常为常数
浮点数/字符串快速排序/归并排序通用比较排序
外部排序(磁盘)归并排序适合多路归并
系统级排序混合排序(如introsort)快排+堆排+插入

六、混合排序(工业级实现)

实际的标准库排序(C++ STLsort、JavaArrays.sort)通常采用混合策略

  1. 数据量大:用快速排序

  2. 递归深度过大:切换为堆排序(防止最坏情况)

  3. 分区后子数组小:用插入排序(小数组效率高)

c

// 混合排序伪代码 void hybridSort(int arr[], int left, int right) { if (right - left < THRESHOLD) { insertionSort(arr, left, right); return; } if (depth > MAX_DEPTH) { heapSort(arr, left, right); return; } int pivot = partition(arr, left, right); hybridSort(arr, left, pivot - 1, depth + 1); hybridSort(arr, pivot + 1, right, depth + 1); }

七、面试高频考点

7.1 手写代码常考

算法考察频率
快速排序⭐⭐⭐⭐⭐
归并排序⭐⭐⭐⭐
堆排序⭐⭐⭐⭐
插入排序⭐⭐⭐
冒泡排序⭐⭐

7.2 概念常考

  • 稳定性的含义及判断

  • 各算法的时间/空间复杂度

  • 为什么快速排序实际最快(缓存友好、常数因子小)

  • 堆排序为什么不稳定

  • 计数排序的局限性


八、快速对比卡片

O(n²) 级(适合小数据)

算法一句话记忆
冒泡两两交换,大的下沉
选择每次选最小的放前面
插入像打牌,插到合适位置

O(n log n) 级(工业标准)

算法一句话记忆
快速选基准,分两边,递归
归并先分后合,需要额外空间
建堆,取堆顶,再调整
希尔分组插入,逐步缩小间隔

O(n) 级(特殊场景)

算法一句话记忆
计数统计频率,直接输出
分到桶里,各桶排序
基数按位分配,逐位收集

九、小结

场景首选备选
通用排序快速排序归并排序
需要稳定归并排序插入排序(小数据)
内存紧张堆排序快速排序
整数范围小计数排序基数排序
数据基本有序插入排序冒泡排序
数据量极小插入排序冒泡排序
外部排序归并排序-

选型口诀

  • 小数据用插入

  • 要稳定用归并

  • 内存紧用堆排

  • 通用场景快排

  • 整数范围小计数


十、思考题

  1. 为什么快速排序的实际表现通常优于归并排序,即使它们的时间复杂度都是 O(n log n)?

  2. 堆排序是原地排序,为什么实际应用中不如快速排序常用?

  3. 计数排序和基数排序的时间复杂度都是 O(n),它们有什么局限性?

  4. 如果你需要排序一个包含100万个整数的文件,内存只有50MB,应该选择什么算法?

欢迎在评论区讨论你的答案。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/8 19:29:46

Ostrakon-VL-8B零售场景优化:针对冷柜反光、玻璃瓶等难点适配

Ostrakon-VL-8B零售场景优化&#xff1a;针对冷柜反光、玻璃瓶等难点适配 1. 零售视觉识别的特殊挑战 零售场景中的视觉识别面临诸多独特挑战&#xff0c;特别是在冷柜和玻璃制品区域。传统计算机视觉算法在这些场景下往往表现不佳&#xff1a; 冷柜反光问题&#xff1a;超市…

作者头像 李华
网站建设 2026/4/10 5:50:13

最易懂的C语言初阶教程——初识C语言

前言本系列教程主打简单易懂&#xff0c;会尽量减少专业名词&#xff0c;多用故事、实例来讲解 C 语言的逻辑。我会把 C 语言知识点拆分成一篇篇独立文章&#xff0c;而非按传统章节划分。每篇内容相互独立&#xff0c;如果你已经掌握了某个知识点&#xff0c;可以直接跳过对应…

作者头像 李华
网站建设 2026/4/10 5:50:12

在当下AI环境下怎么更好的提问问题

在AI时代面临的不是“如何用AI”,而是“如何将你深厚的系统抽象能力、边界判断能力和多年踩坑经验,转化为AI可以精准执行的Prompt”。你的提问方式,需要从“告诉AI怎么做”升级为“引导AI理解你的架构约束和设计意图”。 以下是针对资深技术专家的AI提问方法论,核心是用架…

作者头像 李华
网站建设 2026/4/10 5:47:06

nanobot超轻量级AI助手部署实测:快速体验Qwen3-4B模型的智能回复

nanobot超轻量级AI助手部署实测&#xff1a;快速体验Qwen3-4B模型的智能回复 1. 引言&#xff1a;轻量级AI助手新选择 在AI助手领域&#xff0c;我们常常面临一个两难选择&#xff1a;功能强大的模型往往体积庞大、部署复杂&#xff0c;而轻量级方案又可能功能有限。今天要介…

作者头像 李华
网站建设 2026/4/10 5:46:05

LFM2.5-1.2B-Thinking-GGUF项目实战:基于Vue的前端AI对话界面开发

LFM2.5-1.2B-Thinking-GGUF项目实战&#xff1a;基于Vue的前端AI对话界面开发 1. 项目背景与目标 最近AI对话应用越来越火&#xff0c;但很多开发者只关注后端模型能力&#xff0c;忽略了前端交互体验。实际上&#xff0c;一个流畅、美观的前端界面能显著提升用户满意度。本文…

作者头像 李华
网站建设 2026/4/10 5:46:05

Typora风格Markdown写作体验:Phi-4-mini-reasoning实时辅助排版与内容润色

Typora风格Markdown写作体验&#xff1a;Phi-4-mini-reasoning实时辅助排版与内容润色 1. 引言&#xff1a;当Markdown写作遇上AI助手 作为一名长期使用Markdown写作的技术博主&#xff0c;我一直在寻找能够媲美Typora流畅体验的写作工具。直到最近&#xff0c;我在工作流中集…

作者头像 李华