稳定性
如果一个排序算法能够保留数组中重复元素的相对位置则可以被称为是稳定的
- 稳定的排序算法:插入排序、归并排序
- 不稳定的排序算法:选择排序、希尔排序、快速排序和堆排序
一般只有在稳定性是必要的情况下,稳定的排序算法才有优势。
各种排序算法的性能特点
算法 | 是否稳定 | 是否为原地排序 | 时间复杂度 | 空间复杂度 | 备注 |
---|---|---|---|---|---|
选择排序 | 否 | 是 | N^2 | 1 | |
插入排序 | 是 | 是 | 介于 N 和 N^2 之间 | 1 | 取决于输入元素的排列情况 |
希尔排序 | 否 | 是 | NlogN? | 1 | |
快速排序 | 否 | 是 | NlogN | lgN | 运行效率由概率提供保证 |
三向快速排序 | 否 | 是 | 介于 N 和 NlogN 之间 | lgN | 运行效率由概率保证,同时也取决于输入元素的分布情况 |
归并排序 | 是 | 否 | NlogN | N | |
堆排序 | 否 | 是 | NlogN | 1 |
- 快速排序是最快的通用排序算法。
- 如果稳定性重很重要而空见又不是问题,归并排序可能是最好的选择
Java 系统库的排序算法
Java 的系统程序员选择对原始数据类型使用(三向切分的)快速排序,对引用类型使用归并排序。暗示着用速度和空间(对于原始数据类型)来换取稳定性(对于引用类型)。