稳定排序
定义
能保证排序前两个相等的数其在序列的前后位置顺序和排序后它们两个的前后位置顺序相同。
是不是有点绕口?这里举个例子:
Int a = 10;
Int b = 10;
排序前:....a,b,....
排序后:....a,b,....
也就是说在a = b的前提下,排序前和排序后a和b的前后位置不变,这就叫做稳定排序。
应用
其实就是有两个排序关键字的时候,稳定排序可以让第一个关键字排序的结果服务于第二个关键字排序中数值相等的那些数。
个人理解
这里有几个关键字:相等、排序前、排序后、前后位置。
相等:看你怎么去理解了,10=10这算是一种相等,人身高相等也算是一种相等,这2个相等的区别在于:10除了数值属性外无其他属性、而人除了身高属性外还有体重、性别等属性。这种情况下A与B身高相等,不等于A与B所有属性都相等。
这就是稳定排序的关键所在。
- 假如我把100个人首先按照身高排序,那么我会得到一个从矮到高的一个有序序列。
- 那我再按照体重排序,我会得到一个从轻到重的有序序列,假如张三80KG,李四80KG,那张三与李四怎么排序呢?这里我可以借鉴第一个序列的结果,在体重一致的情况下,按照身高从矮到高排序。
稳定性的意义
- 如果只是简单的进行数字的排序,那么稳定性将毫无意义。
- 如果排序的内容仅仅是一个复杂对象的某一个数字属性,那么稳定性依旧将毫无意义。
- 如果要排序的内容是一个复杂对象的多个数字属性,但是其原本的初始顺序毫无意义,那么稳定性依旧将毫无意义。
- 除非要排序的内容是一个复杂对象的多个数字属性,且其原本的初始顺序存在意义,那么我们需要在二次排序的基础上保持原有排序的意义,才需要使用到稳定性的算法,例如要排序的内容是一组原本按照价格高低排序的对象,如今需要按照销量高低排序,使用稳定性算法,可以使得想同销量的对象依旧保持着价格高低的排序展现,只有销量不同的才会重新排序。(当然,如果需求不需要保持初始的排序意义,那么使用稳定性算法依旧将毫无意义)。
非稳定排序
排序前两个相等的数其在序列的前后位置顺序和排序后它们两个的前后位置顺序不相同。
是不是有点绕口?这里举个例子:
Int a = 10;
Int b = 10;
排序前:....a,b,....
排序后:....b,a,....
也就是说在a = b的前提下,排序前和排序后a和b的前后位置发生变化,这就叫做非稳定排序。
原地排序
在排序过程中不申请多余的存储空间,只利用原来存储待排数据的存储空间进行比较和交换的数据排序。
非原地排序
需要利用额外的数组来辅助排序。
时间复杂度
一个算法执行所消耗的时间。
空间复杂度
运行完一个算法所需的内存大小。