简介

分类比较
类别 | 子分类 | 平均情况 | 最好情况 | 最差情况 | 辅助空间 | 稳定性 | 原址排序 |
---|---|---|---|---|---|---|---|
插入排序 | 直接插入 | 稳定 | 是 | ||||
希尔 | 不稳定 | 是 | |||||
选择排序 | 直接选择 | 不稳定 | 是 | ||||
堆排序 | 不稳定 | 是 | |||||
交换排序 | 冒泡排序 | 稳定 | 否 | ||||
快速排序 | 不稳定 | 否 | |||||
归并排序 | 稳定 | 否 | |||||
桶(基数)排序 | 稳定 | 否 |
基数排序中,表示关键字的基数,表示长度,表示关键字的个数
稳定性:指在排序算法中,相同值的两个元素,在输入数组中先出现的数在输出数组中也先出现
原址排序:基本上不需要额外辅助的的空间,允许少量额外的辅助变量进行的排序。就是在原来的排序数组中比较和交换的排序;
算法选择准则
- 待排序的记录数目n的大小;
- 记录本身数据量的大小,也就是记录中除关键字外的其他信息量的大小;
- 关键字的结构及其分布情况;
- 稳定性要求;
方案选择
设待排序元素的个数为n
-
当n较大
- 快速排序,是目前基于比较的内部排序中被认为是最好的方法,当待排序的关键字是随机分布时,快速排序的平均时间最短
- 堆排序,如果内存空间允许且要求稳定性的
- 归并排序,它有一定数量的数据移动,所以我们可能过与插入排序组合,先获得一定长度的序列,然后再合并,在效率上将有所提高。
当n较大,内存空间允许,且要求稳定性时选择归并排序;
-
n较小时
- 直接插入排序,当元素分布有序,直接插入排序将大大减少比较次数和移动记录的次数;
- 直接选择排序,元素分布有序,如果不要求稳定性,选择直接选择排序;
-
一般不使用或不直接使用传统的冒泡排序;
-
基数排序,它是一种稳定的排序算法,但有一定的局限性:
- 关键字可分解;
- 记录的关键字位数较少,如果密集更好;
- 如果是数字时,最好是无符号的,否则将增加相应的映射复杂度,可先将其正负分开排序;