稳定性体现
- 最初听到稳定性这个概念时,我认为稳定性是体现在时间复杂度上,例如快排的时间复杂度并不稳定,最差情况会退化到O(n^2),但实际定义并不是如此
- 其实排序算法的稳定性体现在其相同键值的两个对象在排序后相对位置并不改变
稳定性应用
- 比如氪金的场景下,假设我们以充值费用的高低来决定玩家在游戏中享受进入副本的先后,当充值费用相同时,我们以需要以充值的先后来决定玩家进入副本的顺序,如果排序不稳定,则无法保证先充值的玩家先进入
各个算法的稳定性
- 冒泡:稳定,每次对比交换,相同的话不会换,时间复杂度O(n^2)
- 选择:不稳定(例如数组[3, 8 , 3, 1, 4]),第一选择会将首个3和1的位置交换,两个3的顺序就被交换了
- 插入:稳定,从已排好序的数组末尾开始插入,相同的数不会改变相对位置
- 快速:不稳定,每次两两交换时就有很大概率破坏相对位置(例如[8,9,7,2,9,3]),第一次就会把首个9和3交换,直接破坏了9的稳定性
- 归并:稳定,归并是将整个数组分到无可分,当只有一个或两个元素时,元素相同时并不会交换位置
- 基数:稳定,每次基于某一位入桶,不会改变相同元素的相对位置
- 希尔:不稳定,每次在自己组内进行插入排序,很容易改变相同元素的相同位置
- 堆排序: 不稳定,每次组成大根堆或者小根堆时顺序不一定一致