对于小规模的数据,O(n**2)的排序算法性能可能比O(nlogn)的排序算法更好
归并排序适合与占用空间比较小的数据集
在其他语言中,插入排序比冒泡排序更好是因为冒泡排序交换需要3个赋值语句,而插入排序只需要一个
冒泡排序和插入排序的交换次数都等于逆序度,无论怎么优化,但最好情况的时间复杂度都是O(n)
归并排序和选择排序的时间复杂度在不同情况下是不会改变的
线性排序:桶排序、计数排序、基数排序
桶排序和计数排序比较类似,桶排序适合用于外部排序,即数据量比较大无法一次性加载到内存中时,计数排序适合于数据范围比较小的场景,计数排序可以是稳定排序,通过将计数数组逐位相加,然后从后往前遍历原数组,取出计数数组的值减1作为结果数组中的下标。再将计数数组相应位置值减1,循环以上操作即可保持稳定。
堆排序没有快速排序好是因为:堆排序的数据访问不友好,不是按序访问的;对于同样的数据,堆排序的交换次数更多,快速排序数据交换次数不会高于逆序度,而堆排序在建堆过程中会打乱数据,使得有序度降低。
一个通用、高性能的排序函数:
C中的排序函数是这样实现的:优先使用归并排序,当要排序的数据量比较大的时候,切换为快速排序,分区点的选择使用三数取中法,堆栈溢出问题可通过实现一个堆上的栈,手动模拟递归来解决。当要排序的区间中,元素的个数小于等于4时,会使用插入排序。