排序算法基本定义:
- 稳定性:排序前相等的两个数,在排完序后相对位置不变
- 内排序:所有排序操作都在内存中完成
- 外排序:大文件的排序,所以将数据放在磁盘中,通过磁盘和内存的数据传输进行排序
- 时间复杂度:一个算法执行所耗费的时间
- 空间复杂度:一个算法执行所需要的内存空间
| 排序算法 | 时间复杂度 | 空间复杂度 | 排序方式 | 稳定性 |
|---|---|---|---|---|
| 插入排序 | O(N^2) | O(1) | 常数内存 | 稳定 |
| 冒泡排序 | O(N^2) | O(1) | 常数内存 | 稳定 |
| 选择排序 | O(N^2) | O(1) | 常数内存 | 不稳定 |
| 快速排序 | O(N * logN) | O(logN) | 常数内存 | 不稳定 |
| 归并排序 | O(N * logN) | O(N) | 额外内存 | 稳定 |
| 堆排序 | O(N * logN) | O(1) | 常数内存 | 不稳定 |
注:插入排序在O(N^2)上常数项是极低的
简记不稳定性排序:选,快,对(堆),选的又快又对
选择排序不稳定举例:3313 -> 1333
快速排序不稳定举例:55553[以5为基准] -> 35555
堆排序不稳定举例:5446变成大根堆的过程 -> 6544[可以自己画图一下]
目前没有找到时间复杂度是 O(N * logN),空间复杂度是O(1),又稳定的排序。
一般我们用快排多一些,因为经过实验表明它的常数项是最低的,如果实在有空间限制就用堆排序,需要稳定性的时候使用归并排序
工程上对排序的改进
- 充分利用O(N * logN)和O(N^2)排序的优势,整体上用快速排序,当样本量 <= 60的时候直接用插入排序了。因为在小样本情况下,N^2瓶颈不明显,反而常数项是限制,所以小样本是插入排序。
- 稳定性,比如面试官如果问你对于普通类型用快排,自己定义的类型用归并,原因是什么,答案就是要考虑稳定性