稳定性
相同值的个体之间,如果不因为排序改变相对次序,那么该排序具有稳定性
复合数据,某个数据先按其中一个值排序,再使用稳定性的排序算法对第二个值排序,
就可以得到按照第二个值排序,同时内部第二个值相同时,按第一个值排序的序列
排序算法稳定性分析
O(N^2)
选择排序:选择序列中的一个最小值,与序列首交换,即破坏了稳定性
冒泡排序:确保两数相等时,不交换位置,即可保证稳定性
插入排序:插入的数在向左移动的过程中,遇到相等的数就停下来,也可以保证稳定性
O(N*logN)
归并排序:当左右序列的当前数相等的时候,先拷贝左边的,具有稳定性(小和问题时,先拷贝右边的,排序正确,但是失去稳定性)
快排排序:存在交换操作,没有稳定性
堆排序:形成大根堆的过程就失去稳定性
计数排序和基数排序都具有稳定性:不基于比较
排序总结
经过实验测试快排的常数最小,空间有限制用堆排,归并具有稳定性。
问题1 基于比较的排序能不能做到时间复杂度在O(NlogN)以下? 不行
问题2 时间复杂度O(NlogN)能不能空间复杂度O(N)且具有稳定性 不行
工程上对于排序的改进,样本量小的时候使用插入排序,样本量大的时候快排
系统自带的排序,基础类型使用快排,非基础的使用归并排序保持稳定性。