排序算法总结对比

十大排序算法总结对比

性能 · 稳定性 · 适用场景一览

十大排序算法一览

排序算法是计算机科学的基础。以下是十种经典排序算法,点击卡片可高亮并在控制台查看简称。

🔄
冒泡排序
相邻比较交换
📥
插入排序
插入已排序区
🔍
选择排序
选最小放前面
🧩
归并排序
分治合并
快速排序
分区递归
🌲
堆排序
建堆调整
🐚
希尔排序
分组插入
🔢
计数排序
统计频率
⚙️
基数排序
按位分配
🪣
桶排序
分桶排序

复杂度与特性对比

不同算法在时间、空间效率和稳定性上各有优劣。点击表头可按该列排序,点击行可高亮。

算法 最坏时间 平均时间 空间复杂度 稳定性 适用场景
冒泡排序O(n²)O(n²)O(1)稳定小规模数据
插入排序O(n²)O(n²)O(1)稳定部分有序数据
选择排序O(n²)O(n²)O(1)不稳定内存受限
归并排序O(n log n)O(n log n)O(n)稳定大规模, 稳定需求
快速排序O(n²)O(n log n)O(log n)不稳定通用, 高效
堆排序O(n log n)O(n log n)O(1)不稳定常数空间, Top K
希尔排序O(n^(3/2))O(n^(4/3))~O(n^(3/2))O(1)不稳定中等规模
计数排序O(n + k)O(n + k)O(k)稳定范围有限整数
基数排序O(d(n + k))O(d(n + k))O(n + k)稳定整数/字符串
桶排序O(n²)O(n + k)O(n + k)稳定均匀分布数据

注:n=数据规模, k=桶/范围, d=位数。时间复杂度为近似值。

算法复杂度增长趋势

直观感受不同时间复杂度随数据规模 (n) 增长的速度。点击图例可切换曲线显示。

适用场景与选型建议

没有绝对最优的算法,选择需结合具体需求:数据量、是否有序、稳定性要求、内存限制等。

场景一:小规模 / 基本有序

推荐:插入排序、冒泡排序 (优化版)

  • 插入排序对近乎有序数据效率高,接近 O(n)。
  • 实现简单,常数开销小。
  • 稳定排序。
  • 原地排序,空间 O(1)。

场景二:大规模 / 通用

推荐:快速排序、堆排序

  • 快速排序平均性能最好 O(n log n),应用广泛。
  • 堆排序最坏情况稳定 O(n log n),且空间 O(1)。
  • 快排不稳定,堆排序不稳定。
  • 若内存充足且需稳定,考虑归并排序。

场景三:特殊数据分布 / 稳定需求

推荐:归并排序、计数排序、基数排序、桶排序

  • 归并排序:稳定,O(n log n),需 O(n) 空间。
  • 计数排序:数据范围集中且不大时,O(n + k)。
  • 基数排序:整数或字符串,O(d(n + k))。
  • 桶排序:数据均匀分布时,平均 O(n + k)。
  • 以上线性排序算法通常是稳定的。

基础知识练习 - 选择题

检验你对排序算法基础知识的掌握程度。

基础知识练习 - 判断题

判断下列关于排序算法描述的对错。

代码阅读理解

通过分析代码片段,加深对算法实现细节的理解。

知识延伸

排序算法的世界远不止于此,了解一些高级概念和实际应用。

混合排序 (Hybrid Sorts)

结合多种排序算法优点,在不同情况下切换策略。

  • Timsort: Python `list.sort()`, Java `Arrays.sort()` (对象)。结合归并和插入排序,对现实世界数据优化。
  • Introsort (内省排序): C++ `std::sort`。以快速排序为主,在递归深度过大时切换到堆排序,小数组用插入排序。

并行与外部排序

处理超大规模数据集。

  • 并行排序: 利用多核处理器并行处理数据,如并行归并、并行快速排序。
  • 外部排序: 数据量远超内存容量时,利用磁盘等外部存储进行排序,通常基于归并思想。

库函数实现

各语言标准库通常提供高度优化的排序函数。

  • C++ `std::sort`: 通常是 Introsort,高效且实用。
  • Python `list.sort()` / `sorted()`: Timsort,稳定且对部分有序数据友好。
  • Java `Arrays.sort()`: 基本类型用双轴快排,对象用 Timsort/归并。

了解库函数背后的实现,有助于更好地选择和使用它们。

排序算法是计算机科学的基石,持续学习和实践是掌握的关键!