排序法 | 平均时间 | 最差情况 | 稳定性 | 额外空间 | 备注 |
---|---|---|---|---|---|
直接插入 | O ( n 2 ) O(n^2) O(n2) | O ( n 2 ) O(n^2) O(n2) | 稳定 | O(1) | 大部分已排序时较好 |
shell | O ( n 1.3 ) O(n^{1.3}) O(n1.3) | O ( n 2 ) O(n^2) O(n2) | 不稳定 | O(1) | 时间复杂度计算复杂,网上有多种说法 |
直接选择 | O ( n 2 ) O(n^2) O(n2) | O ( n 2 ) O(n^2) O(n2) | 不稳定 | O(1) | 时间复杂度与初始序列无关 |
堆排序 | O(nlogn) | O(nlogn) | 不稳定 | O(1) | 可以快速选出最小(最大)的几个数字;时间复杂度与初始序列无关 |
冒泡排序 | O ( n 2 ) O(n^2) O(n2) | O ( n 2 ) O(n^2) O(n2) | 稳定 | O(1) | n较小时较好 |
快速排序 | O(nlogn) | O(nlogn) | 不稳定 | O(nlogn) | 已经完全有序的时候,最费时 |
基数排序 | O(d(r+n) | O(d(r+n) | 稳定 | O(n) | d是关键字位数,r是进制 |
归并排序 | O(nlogn) | O(nlogn) | 稳定 | O(n) | 外部排序算法,适合n很大很大很大很大,大到内存一次装不下时使用;归并趟数 ⌈ l o g k n ⌉ \lceil log_k n\rceil ⌈logkn⌉,k是归并路数,n是初始归并段 |
辅助记忆:改进后的算法们O(nlogn)比改进前O(n2)的速度更快,但牺牲了稳定性。直接选择排序是最拉胯的排序,最好最坏都是O(n2),还tm的不稳定。只有快速排序、归并排序和基数排序需要额外空间。堆排序虽然是不稳定的排序,但时间上很稳定。