排序算法复杂度/稳定性总结
类别 | 排序法 | 时间复杂度 | 空间复杂度 | 稳定性 | 备注 | ||
平均 | 最差 | 最好 | |||||
插入排序 | 直接插入 | O(n^2) | O(n^2) | O(n) | O(1) | 稳定 | |
Shell | O(n^[1~2]) | O(n^1.25)? | O(1) | 不稳定 | |||
选择排序 | 直接选择 | O(n^2) | O(n^2) | O(n^2) | O(1) | 不稳定 | |
堆排序 | O(nlogn) | O(nlogn) | O(nlogn) | O(1) | 不稳定 | ||
交换排序 | 冒泡排序 | O(n^2) | O(n^2) | O(n) | O(1) | 稳定 | |
快速排序 | O(nlogn) | O(n^2) | O(nlogn) | O(logn)~O(n) | 不稳定 | ||
归并排序 | O(nlogn) | O(nlogn) | O(nlogn) | O(n) | 稳定 | ||
基数排序 | O(d(n+k)) | O(d(n+k)) | O(d(n+k)) | O(n+k) | 稳定 |
1 直接插入:按次序将下一个元素从后向前比较,插入到第一个有序位置。
2 shell sort:先分组,每组下标距离相等,进行组内直接插入排序。重复上一步骤,每次距离(按某种规则,但相邻值不为倍数为佳)递减直到1。最后一次即对一个基本有序序列进行直接插入排序。
3 直接选择排序:从待排序列中选择最小(大)与第一个(最后一个)元素交换次序。
4 堆排序:最大或最小堆,父结点元素大于或者小于所以子结点元素。以最大堆为例,先建立堆,再将最大值与最后一个元素交换,调整前面n-1个元素形成的堆为最大堆。
5 冒泡排序:依次两两比较并交换次序。
6 快速排序:将小于和大于某一旗语的元素分列两边,再对两部分进行快速排序。
7 归并排序:对左右两个子序列进行归并再合并。
8 基数排序:按位数排序,最小位到最大位。