排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。
十种常见排序算法可以分为两大类,如下图所示。
- 比较类排序: 通过比较来决定元素间的相对次序,由于其时间复杂度不能突破 O ( n l o g n ) O(nlogn) O(nlogn),因此也称为非线性时间比较类排序。
- 非比较类排序: 不通过比较来决定元素间的相对次序,它可以突破基于比较排序的时间下界,以线性时间运行,因此也称为线性时间非比较类排序。
常见排序算法简介如下表所示。
排序方法 | 最好时间复杂度 | 最坏时间复杂度 | 平均时间复杂度 | 辅助空间复杂度 | 稳定性 | 博客链接 |
---|---|---|---|---|---|---|
直接插入排序 | 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. 记录较大,采用快速排序、堆排序、归并排序。