0.十大经典排序算法
- 冒泡排序(BubbleSort)
- 选择排序(SelectionSort)
- 插入排序(InsertionSort)
- 希尔排序(ShellSort)
- 归并排序(MergeSort)
- 快速排序(QuickSort)
- 堆排序(HeapSort)
- 计数排序(CountSort)
- 桶排序(BucketSort)
- 基数排序(RadixSort)
1.排序算法分类
非线性时间比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此称为非线性时间比较类排序。
线性时间非比较类排序:不通过比较来决定元素间的相对次序,它可以突破基于比较排序的时间下界,以线性时间运行,因此称为线性时间非比较类排序。
2.时间 / 空间复杂度对比
算法名称 | 时间复杂度 | 空间复杂度 | 排序方式 | 稳定性 | ||
最佳 | 平均 | 最差 | 最差 | |||
冒泡排序(BubbleSort) | O(n) | O(n^2) | O(n^2) | O(1) | In-place | 稳定 |
选择排序(SelectionSort) | O(n^2) | O(n^2) | O(n^2) | O(1) | In-place | 不稳定 |
插入排序(InsertionSort) | O(n) | O(n^2) | O(n^2) | O(1) | In-place | 稳定 |
希尔排序(ShellSort) | O(n) | O((nlog(n))^2) | O((nlog(n))^2) | O(1) | In-place | 不稳定 |
归并排序(MergeSort) | O(nlog(n)) | O(nlog(n)) | O(nlog(n)) | O(n) | Out-place | 稳定 |
快速排序(QuickSort) | O(nlog(n)) | O(nlog(n)) | O(n^2) | O(log(n)) | In-place | 不稳定 |
堆排序(HeapSort) | O(nlog(n)) | O(nlog(n)) | O(nlog(n)) | O(1) | In-place | 不稳定 |
计数排序(CountSort) | O(n+k) | O(n+k) | O(n+k) | O(k) | Out-place | 稳定 |
桶排序(BucketSort) | O(n+k) | O(n+k) | O(n^2) | O(n) | Out-place | 稳定 |
基数排序(RadixSort) | O(nk) | O(nk) | O(nk) | O(n+k) | Out-place | 稳定 |
名词解释:
- n: 数据规模
- k: “桶”的个数
- In-place: 所有排序操作都在内存中完成
- Out-place: 由于数据太大,因此把数据放在磁盘中,而排序通过磁盘和内存的数据传输才能进行
- 稳定性:假设在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,则称这种排序算法是稳定的;否则称为不稳定的。