排序概述

排序算法分析

执行效率:

  • 最好、最坏、平均时间复杂度
  • 时间复杂度的系数、常数、低阶
  • 比较次数、交换(或移动)次数

空间复杂度:原地排序(Sorted in place)。原地排序算法,就是特指空间复杂度是 O(1) 的排序算法。

有序度:

  • 有序度:有序元素对 a[i] <= a[j],如果 i < j 的数量
  • 满序度
    • 完全有序的数组
    • 对于长度为 n 的数组 满序度 = n * (n - 1) / 2
    • 举例:长度 6 的数组,满序度 = 6 * (6 - 1) / 2 = 15
  • 逆序度:逆序度 = 满序度 - 有序度

稳定性

稳定性:如果待排序的序列中存在值相等的元素,经过排序之后,相等元素之间原有的先后顺序不变。

  • 稳定:如果 a 原本在 b 前面,而 a = b,排序之后 a 仍然在 b 的前面
  • 不稳定:如果 a 原本在 b 的前面,而 a = b,排序之后 a 可能会出现在 b 的后面

排序方法

  • 内排序:所有排序操作都在内存中完成,占用常数内存,不占用额外内存
  • 外排序:由于数据太大,因此把数据放在磁盘中,而排序通过磁盘和内存的数据传输才能进行,占用额外内存

复杂度

  • 时间复杂度:一个算法执行所耗费的时间
  • 空间复杂度:运行完一个程序所需内存的大小

常见排序算法汇总

名词解释:

  • n:数据规模
  • k:桶的个数
排序算法平均时间复杂度最好情况最坏情况空间复杂度原地排序稳定性
冒泡排序O(n^2)O(n)O(n^2)O(1)
选择排序O(n^2)O(n^2)O(n^2)O(1)
插入排序O(n^2)O(n)O(n^2)O(1)
希尔排序O(n log n)O(n(log2/2n))O(n(log2/2n))O(1)
归并排序O(n log n)O(n log n)O(n log n)O(n)
快速排序O(n log n)O(n log n)O(n^2)O(log n)
堆排序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 + k)O(n + k)O(n + k)
基数排序O(n * k)O(n * k)O(n * k)O(n + k)

从分类上来讲:

  • 比较类
    • 交换排序
      • 冒泡排序 Bubble Sort
      • 双向冒泡排序
      • 快速排序 Quick Sort
    • 插入排序
      • 直接插入排序 Insertion Sort
      • 二分插入排序 Binary Insertion Sort
      • 希尔排序 Shell Sort
    • 选择排序
      • 简单选择 Selection Sort
      • 堆 Heap Sort
    • 归并排序
      • 二路归并 Two-way Merge
      • 多路归并 Muti-way Merge
  • 非比较类(分布排序)
    • 计数排序 Counting Sort(*)
    • 桶排序 Bucket Sort(*)
    • 基数排序 Radix Sort(*)

带(*)的排序算法需要额外的空间。

nlogn 比 n^2 快多少?

n^2nlognfaster
n = 10100333
n = 1001000066415
n = 100010^69966100
n = 1000010^8132877753
n = 10000010^1016609646020

参考资料