排序法 | 平均时间 | 最差情形 | 稳定度 | 额外空间 | 备注 |
冒泡 | O(n2) | O(n2) | 稳定 | O(1) | n小时较好 |
交换 | O(n2) | O(n2) | 不稳定 | O(1) | n小时较好 |
选择 | O(n2) | O(n2) | 不稳定 | O(1) | n小时较好 |
插入 | O(n2) | O(n2) | 稳定 | O(1) | 大部分已排序时较好 |
基数 | O(logRB) | O(logRB) | 稳定 | O(n) | B是真数(0-9), R是基数(个十百) |
Shell | O(nlogn) | O(ns) 1<s<2 | 不稳定 | O(1) | s是所选分组 |
快速 | O(nlogn) | O(n2) | 不稳定 | O(nlogn) | n大时较好 |
归并 | O(nlogn) | O(nlogn) | 稳定 | O(n) | n大时较好 |
堆 | O(nlogn) | O(nlogn) | 不稳定 | O(1) | n大时较好 |
- 若n较小:直接选择或直接插入。此时如果记录本身信息量较大应选择直接选择排序,因为直接插入排序的移动记录次数比直接选择多很多。
- 若n较大,应选择时间为O(nlogn)的快排、归并或堆排序。快排时间依赖于数组原始情况,当原始数组较随机时时间短;归并不依赖与数组的原始情况,但是有空间代价为o(n)。
- 当原始数组基本有序时用直接插入或冒泡排序。