第二章 排序(四) - 《算法》读书笔记
第二章 排序(四)
2.5.2 我应该使用哪种排序算法
如果一个排序算法能够保留数组中重复元素的相对位置则可以被称为是稳定的
- 各种排序算法的性能特点
| 算法 | 是否稳定 | 是否为原地排序 | 时间复杂度 | 空间复杂度 | 备注 |
|---|---|---|---|---|---|
| 选择排序 | 否 | 是 | N2 | 1 | |
| 插入排序 | 是 | 是 | 介于N和N2之间 | 1 | 取决于输入元素的排列情况 |
| 希尔排序 | 否 | 是 | NlogN?N6/5? | 1 | |
| 快速排序 | 否 | 是 | NlogN | lgN | 运行效率由概率提供保证 |
| 三向快速排序 | 否 | 是 | 介于N和NlogN之间 | lgN | 运行效率由概率保证,同时也取决于输入元素的分布情况 |
| 归并排序 | 是 | 否 | NlogN | N | |
| 堆排序 | 否 | 是 | NlogN | 1 |
快速排序是最快的通用排序算法
2.5.2.2 Java系统库的排序算法
- java.util.Arrays.sort():
- 每种原始数据类型都有一个不同的排序方法
- 一个适用于所有实现了Comparable接口的数据类型的排序方法
- 一个适用于实现了比较器Comparator的数据类型的排序方法
- 对原始数据类型使用(三向切分的)快速排序,对引用类型使用归并排序。
2.5.3.4 中位数与顺序统计
- 用快速排序的切分法实现找一组数中的第k小元素:
publuc static Comparable select(Comparable[] a, int k){
StdRandom.shuffle(a);
int lo = 0, hi = a.length - 1;
while(hi > lo){
int j = partition(a, lo, hi);
if(j == k) return a[k];
else if(j > k) hi = j - 1;
else lo = j + 1;
}
return a[k];
}
平均来说,基于切分的选择算法的运行时间是线性级别的

浙公网安备 33010602011771号