排序算法

星隐

简介

计算机科学数学中,排序算法(英语:Sorting algorithm)是一种能将数据依照特定顺序排列的算法。排序后的数据可存储在有序数组中。
常见的排序方式:

  • 数值顺序
  • 字典顺序

排序算法在搜索算法合并算法、文字处理及输出格式化等领域都有重要应用。

排序算法的结果必须满足:

  1. 输出为递增(或递减)序列,依排序要求而定。
  2. 输出是输入的一种排列重组

虽然排序问题看似简单,但已有大量研究。例如,冒泡排序早在1956年就已提出。至今仍不断有新算法出现,如图书馆排序(2004年)。


分类标准

排序算法常按以下指标分类:

  1. 时间复杂度(最差、平均、最好性能)
    • 常见复杂度:
      • 好的: O(n log n)
      • 坏的: O(n²)
      • 理想: O(n)(基于比较的排序通常至少为 O(n log n)
  2. 内存使用量(额外空间及系统资源消耗)
  3. 稳定性
    稳定排序会保持相等键值记录的原有相对顺序。
  4. 排序方法
    • 插入
    • 交换
    • 选择
    • 合并
    • 其他

稳定性说明

例子:按第一个数字排序的数对:

1
(4,1) (3,1) (3,7) (5,6)
  • 稳定排序结果:
1
(3,1) (3,7) (4,1) (5,6)
  • 不稳定排序结果:
1
(3,7) (3,1) (4,1) (5,6)

不稳定排序可能改变相等键值中记录的相对次序,稳定排序则不会。


排序算法列表

稳定排序

  • 冒泡排序(Bubble sort)— O(n²)
  • 插入排序(Insertion sort)— O(n²)
  • 鸡尾酒排序(Cocktail sort)— O(n²)
  • 桶排序(Bucket sort)— O(n);需 O(k) 空间
  • 计数排序(Counting sort)— O(n+k);需额外 O(n+k) 空间
  • 归并排序(Merge sort)— O(n log n);需 O(n) 空间
  • 原地归并排序 — O(n log² n)(最佳版本)
  • 二叉排序树排序(Binary tree sort)— 平均 O(n log n),最坏 O(n²);需 O(n) 空间
  • 鸽巢排序(Pigeonhole sort)— O(n+k);需 O(k) 空间
  • 基数排序(Radix sort)— O(nk);需 O(n) 空间
  • 侏儒排序(Gnome sort)— O(n²)
  • 图书馆排序(Library sort)— 平均 O(n log n),最坏 O(n²)
  • 块排序(Block sort)— O(n log n)
  • Tim排序(Timsort)— 平均/最坏 O(n log n),最佳 O(n);需 O(n) 空间

不稳定排序

  • 选择排序(Selection sort)— O(n²)
  • 希尔排序(Shell sort)— O(n log² n)(最佳版本)
  • 克洛弗排序(Clover sort)— 平均 O(n),最坏 O(n²)
  • 梳排序(Comb sort)— O(n log n)
  • 堆排序(Heap sort)— O(n log n)
  • 平滑排序(Smooth sort)— O(n log n)
  • 快速排序(Quick sort)— 平均 O(n log n),最坏 O(n²)
  • 内省排序(Introsort)— O(n log n)
  • 耐心排序(Patience sort)— 最坏 O(n log n + k);需 O(n+k) 额外空间

非实用排序

  • Bogo排序 — O(n × n!)(期望时间可能无穷)
  • Stupid排序 — O(n³)(递归版 O(n²)
  • 珠排序 — O(n)O(√n)(需特殊硬件)
  • 煎饼排序 — O(n)(需特殊硬件)
  • 臭皮匠排序 — O(n^{2.7})

部分排序算法比较表

排序算法 数据结构 稳定性 平均时间复杂度 最坏时间复杂度 空间复杂度 描述
冒泡排序 数组 稳定 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(1) 用最大堆取出最大值
归并排序 数组 稳定 O(n log n) O(n log n) O(n) 分治法合并两有序段
快速排序 数组 不稳定 O(n log n) O(n²) O(log n) 选基准分区后递归排序
希尔排序 数组 不稳定 O(n log² n) O(n²) O(1) 按间隔分组执行插入排序
计数排序 数组 稳定 O(n+m) O(n+m) O(n+m) 计数映射元素位置
桶排序 数组/链表 稳定 O(n) O(n²) O(m) 使用桶分布数据
基数排序 数组/链表 稳定 O(k × n) O(k × n) O(n+k) 多关键字排序

参考链接

  • 标题: 排序算法
  • 作者: 星隐
  • 创建于 : 2025-11-29 14:12:33
  • 更新于 : 2026-01-19 01:58:27
  • 链接: https://www.starin.top/post/67d6da0edb8b/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。