排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。

  十种常见排序算法可以分为两大类,如下图所示。

  1. 比较类排序: 通过比较来决定元素间的相对次序,由于其时间复杂度不能突破 O ( n l o g n ) O(nlogn) O(nlogn),因此也称为非线性时间比较类排序。
  2. 非比较类排序: 不通过比较来决定元素间的相对次序,它可以突破基于比较排序的时间下界,以线性时间运行,因此也称为线性时间非比较类排序。

十大排序算法总结_排序算法
  常见排序算法简介如下表所示。

排序方法 最好时间复杂度 最坏时间复杂度 平均时间复杂度 辅助空间复杂度 稳定性 博客链接
直接插入排序 O ( n ) O(n) O(n) O ( n 2 ) O(n^{2}) O(n2) O ( n 2 ) O(n^{2}) O(n2) O ( 1 ) O(1) O(1) 稳定 直接插入排序算法
折半插入排序 O ( n ) O(n) O(n) O ( n 2 ) O(n^{2}) O(n2) O ( n 2 ) O(n^{2}) O(n2) O ( 1 ) O(1) O(1) 稳定 折半插入排序算法
简单选择排序 O ( n 2 ) O(n^{2}) O(n2) O ( n 2 ) O(n^{2}) O(n2) O ( n 2 ) O(n^{2}) O(n2) O ( 1 ) O(1) O(1) 不稳定 简单选择排序算法
冒泡排序 O ( n ) O(n) O(n) O ( n 2 ) O(n^{2}) O(n2) O ( n 2 ) O(n^{2}) O(n2) O ( 1 ) O(1) O(1) 稳定 冒泡排序算法
希尔排序 O ( 1 ) O(1) O(1) 不稳定 希尔排序算法
快速排序 O ( n l o g n ) O(nlogn) O(nlogn) O ( n 2 ) O(n^{2}) O(n2) O ( n l o g n ) O(nlogn) O(nlogn) O ( n ) O(n) O(n) 不稳定 快速排序算法
堆排序 O ( n l o g n ) O(nlogn) O(nlogn) O ( n l o g n ) O(nlogn) O(nlogn) O ( n l o g n ) O(nlogn) O(nlogn) O ( 1 ) O(1) O(1) 不稳定
归并排序 O ( n l o g n ) O(nlogn) O(nlogn) O ( n l o g n ) O(nlogn) O(nlogn) O ( n l o g n ) O(nlogn) O(nlogn) O ( n ) O(n) O(n) 稳定 归并排序算法
计数排序 O ( n + 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) O ( k ) O(k) O(k) 稳定
桶排序 O ( n + k ) O(n+k) O(n+k) O ( n + k ) O(n+k) O(n+k) O ( n 2 ) O(n^{2}) O(n2) O ( n + k ) O(n+k) O(n+k) 稳定
基数排序 O ( n × k ) O(n \times k) O(n×k) O ( n × k ) O(n \times k) O(n×k) O ( n × k ) O(n \times k) O(n×k) O ( n + k ) O(n+k) O(n+k) 稳定

  结论: 1. 当初始序列基本有序时,直接插入排序最快,快速排序慢(在初始序列较为混乱时快);
      2. 归并排序对初始序列排序不敏感,速度稳定;
      3. 记录个数较少,采用插入排序或选择排序,记录本身信息量大,采用简单选择排序;
      4. 记录较大,采用快速排序、堆排序、归并排序。