排序算法稳定性
所谓稳定性是指待排序的序列中有两元素相等,排序之后它们的先后顺序不变.假如为A1,A2.它们的索引分别为1,2.则排序之后A1,A2的索引仍然是1和2.
稳定也可以理解为一切皆在掌握中,元素的位置处在你在控制中.而不稳定算法有时就有点碰运气,随机的成分.当两元素相等时它们的位置在排序后可能仍然相同.但也可能不同.是未可知的.
另外要注意的是:算法思想的本身是独立于编程语言的,所以你写代码去实现算法的时候很多细节可以做不同的处理.采用不稳定算法不管你具体实现时怎么写代码,最终相同元素位置总是不确定的(可能位置没变也可能变了).而稳定排序算法是你在具体实现时如果细节方面处理的好就会是稳定的,但有些细节没处理得到的结果仍然是不稳定的.
比如冒泡排序,插入排序,归并排序虽然是稳定排序算法,但如果你实现时细节没处理好得出的结果也是不稳定的。
冒泡排序,如果比较的时候遇到相等的元素不交换位置,而让该元素继续向后比较,这种机制下的冒泡就是稳定的。
插入排序,往前面有序的序列插入时,如果碰到相等的,不交换即可。
选择排序,就无法修改为稳定排序!
归并排序,merge的时候,遇到相等的元素,先拷贝左边的,即可实现稳定排序。
快速排序,随机选择一个数据作为基准数,后续是无法实现稳定的!
堆排序也做不到稳定,建立大根堆的过程就无法保证稳定了,可以用44455这个例子走遍流程!
稳定性的现实意义
我们平时自己在使用排序算法时用的测试数据就是简单的一些数值本身,没有任何关联信息。但在实际应用中信息是复杂的,排序的数值一般都关联了其他信息,比如多个班多名同学的成绩,如果按照成绩排名,同班的同学肯定也会因为成绩不同出现一个次序,之后如果再按照班级排序,则同班同学会被排到一起,但是同班同学间的顺序还是会依照成绩的顺序,这就是稳定性。
可能大部分时候我们不用考虑算法的稳定性.两个元素相等位置是前是后不重要.但有些时候稳定性确实有用处.它体现了程序的健壮性.比如你网站上针对最热门的文章或啥音乐电影之类的进行排名.由于这里排名不会像我们成绩排名会有并列第几名之说.所以出现了元素相等时也会有先后之分.如果添加进新的元素之后又要重新排名了.之前并列名次的最好是依然保持先后顺序才比较好.
---------------------
作者:zxyCloud
来源:优快云
原文:https://blog.youkuaiyun.com/guoke2017/article/details/80929134
版权声明:本文为博主原创文章,转载请附上博文链接!
工程中的综合排序算法
1、数据量较大的情况下,若需要排序的是基本数据类型,则选择快速排序。若你需要排序的是引用数据类型(如Student),则选择归并排序。(基于稳定性考虑)
因为基本数据类型之间无差异,不需要考虑排序算法稳定性,而归并排序则可以实现算法的稳定性。
2、当你需要排序的样本数量小于60,直接选择插入排序,虽然插入排序的时间复杂度为O(N²),我们是忽略常数项得出来的O(N²),但在魔数60以内,插入排序的时间复杂度为O(N²)的劣势体现不出来,反而插入排序常数项很低,导致在小样本情况下,插入排序极快。
3、如果一开始数组容量很大,但可以分治处理,分治后如果数组容量(L>R - 60)小于60,可以直接选择插排。当大样本下考虑情况1。
---------------------
作者:itcats_cn
来源:优快云
原文:https://blog.youkuaiyun.com/itcats_cn/article/details/81429155
版权声明:本文为博主原创文章,转载请附上博文链接!