属于稳定排序的算法有:冒泡排序、插入排序(包括直接插入和折半插入)、归并排序、基数排序、计数排序、桶排序
属于原地排序的算法有:冒泡排序、插入排序、选择排序、堆排序、中值排序、快速排序、希尔排序
既稳定又是原地排序的算法有:冒泡排序、插入排序
各排序算法详细性能小结
算法名称 | 原地排序 | 稳定排序 | 时间复杂度(最佳/最差/平均) | 适用的情景 |
yes | yes | O(n*n)/O(n*n)/O(n*n) | 仅对于少量数据的排序才会适用,但相对来说并没有什么很大的优势 | |
yes | yes | O(n)/O(n*n)/O(n*n) | 在处理小数据尤其是数据基本上已排好序的前提下,则插入排序当属首选了。不过仍然逃不过只能适用于小量数据的排序,数量一般不超过1000 | |
yes | no | O(n*n)/O(n*n)/O(n*n) | 交换的次数比冒泡排序来说要少一点,而且也较好实现,不过仍然仅限于少量数据的处理 | |
yes | no | O(nlogn)/O(nlogn)/O(nlogn) | 堆排序不是一个稳定的排序,而且非常频繁的移动数据,建议不要使用在基于值的数据,但可以用于指针类型排序。 | |
中值排序 | yes | no | O (nlogn)/ O (n2)/ O (nlogn) | 和快速排序基本相同,但快速排序应用得更广泛一点。 |
yes | no | O (nlogn)/ O (n2)/ O (nlogn) | 应用相当的广泛,必须熟练掌握的算法之一。但因为不是一个稳定排序,所以在要求具有稳定性的情况下是不能够适用的。 | |
no | yes | O (n)/ O (nlogn)/ O (nlogn) | 在时间复杂度上相对快速排序来说并没有什么太大优势,空间复杂度却有较高,所以在快速排序面前基本上没有什么太大优势,但也是最好熟练掌握的一种算法 | |
yes | no | O(n)/O(n)/根据步长来具体确定 | 比较偏门的算法吧,应用之处倒也没有什么特别要求,全凭环境而定吧 | |
no | yes | O(n)/O(n)/O(n) | 在数据范围很小时,这个就基本上是最实用高效的算法了吧 | |
no | yes | O(n)/O(n)/O(n) | 和桶排序的思想类似,但基本上是单一的应用在数值排序上 | |
no | yes | O(n)/O(n)/O(n) | 当数据能够以一个快速hash函数均匀的分配时,桶排序就是最快的排序算法了 |