类别 | 排序方法 | 平均时间复杂度 | 最坏时间复杂度 | 辅助空间 | 稳定性 |
插入 | 直接插入排序 | O(n2) | O(n2) | O(1) | 稳定 |
希尔排序 | O(n1.3) | O(n2) | O(1) | 不稳定 | |
选择 | 直接选择排序 | O(n2) | O(n2) | O(1) | 不稳定 |
堆排序 | O(nlogn) | O(nlogn) | O(1) | 不稳定 | |
交换 | 冒泡排序 | O(n2) | O(n2) | O(1) | 稳定 |
快速排序 | O(nlogn) | O(n2) | O(nlogn) | 不稳定 | |
归并排序 | O(nlogn) | O(nlogn) | O(n) | 稳定 |
一、什么是排序算法的稳定性
假设在数列中存在a[ i ] = a[ j ]。若在排序之前,a[ i ]在a[ j ]前面;并且排序之后,a[ i ]仍然在a[ j ]前面。则这个排序算法是稳定的!
二、选择哪种排序算法
(1)当n较大,则应采用时间复杂度为O(nlog2n)的排序方法:快速排序、堆排序或归并排序。
- 快速排序:是目前基于比较的内部排序中被认为是最好的方法,当待排序的关键字是随机分布时,快速排序的平均时间最短。
- 堆排序:所需的辅助空间少于快速排序,并且不会出现快速排序可能出现的最坏情况。
- 归并排序:它有一定数量的数据移动,所以我们可能要与插入排序组合,先获得一定长度的序列,然后再合并,在效率上将有所提高。
(2)当n较大,内存空间允许,且要求稳定性 =》归并排序。
(3)当n较小,可采用直接插入或直接选择排序。
- 直接插入排序:当元素分布有序时,直接插入排序将大大减少比较次数和移动记录的次数。
- 直接选择排序 :元素分布有序,如果不要求稳定性,选择直接选择排序。
(4)一般不使用或不直接使用传统的冒泡排序。