数据结构与算法(DSA)学习笔记之排序
- 数据结构中的一种基本运算,分为内(部)排序和外(部)排序两大类。
内排序:待排序的数据量不大,全部数据都可以放入内存,排序操作完全在内存中进行。
外排序:待排序的数据量大,全部数据不能同时放在内存中,需要借助外存完成排序过程。涉及到数据内外存交换的问题,将数据分批读到内存中去排序,然后写入外存中。
常用的排序方法有:
- 插入排序
- 交换排序
- 选择排序:
- 归并排序:将两个或两个以上的有序序列合并为一个有序序列。归并排序就是反复合并有序序列的过程,由最初的数量众多的短顺串,逐步合并为一个包含所有数据的结果顺串。
- 基数排序
八大排序算法:快速排序、冒泡排序、直接选择排序、堆排序、归并排序、直接插入排序、折半插入排序、希尔排序。
几种内部排序方法的比较:
排序方法 | 最优时间复杂度 | 平均时间复杂度 | 最差时间复杂度 | 稳定性 |
插入排序 | O(n) | O(n^2) | O(n^2) | 稳定 |
冒泡排序 | O(n^2) | O(n^2) | O(n^2) | 稳定 |
选择排序 | O(n^2) | O(n^2) | O(n^2) | 稳定 |
希尔排序 | O(n^(3/2)) | 不稳定 | ||
快速排序 | O(n log n) | O(n log n) | O(n^2) | 不稳定 |
归并排序 | O(n log n) | O(n log n) | O(n log n) | 稳定 |
堆排序 | O(n log n) | O(n log n) | O(n log n) | 不稳定 |
基数排序 | O(n log n) | O(n log n) | O(n log n) | 稳定 |
大多数情况下,我们用平均时间复杂度来衡量一个排序算法的优劣。
在几种排序算法中,如果考虑平均时间复杂度的话,快速排序算法性能最好,归并排序次之,堆排序最差;特别是当待排序数据量n很大时,归并排序优于堆排序。
有算法理论证明,任何一种内部排序算法所能达到的最佳时间复杂度为O(n log n)。
通常,平均时间复杂度为O(n^2)的排序算法基本上是稳定的。