排序总结

名称平均时间复杂度额外空间复杂度in-place稳定性
冒泡排序O(n2)O(1)true稳定
选择排序O(n2)O(1)true不稳定
插入排序O(n2)O(1)true稳定
归并排序O(n * log n)O(n)false稳定
快速排序O(n * log n)O(log n)true不稳定
希尔排序O(n1.3)O(1)true不稳定
堆排序O(n * log n)O(1)true不稳定
计数排序O(max(n,范围))O(范围)false稳定
基数排序O(p(n+b))O(n+b)false稳定
桶排序O(n + n(log n - log m))O(m+n)false依赖于桶内排序

冒泡排序:n比较小时考虑采用、实现简单但速度慢、每次只移动相邻两个元素

选择排序:n比较小时考虑采用、实现简单但速度慢、移动次数较少但不稳定、数据不敏感

插入排序:n比较小时考虑采用、实现简单但速度慢、由于元素移动代价小于元素交换代价所以速度略优于冒泡排序、n越小越有序效率越高

归并排序:n比较大时考虑采用、数据不敏感、需要O(n)额外空间

快速排序:n比较大时考虑采用、速度快元素移动少但不稳定、序列越乱,效率越高

希尔排序:在中小型数组中效率特别快、比较是其中最主要的操作、不稳定

堆排序:适合处理海量数据、不稳定、数据不敏感

计数排序:当数据范围比较小时速度非常快

基数排序:适合多关键字排序

桶排序:当范围已经知道,而且空间不是很重要的情况下考虑采用桶排序