ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

【算法day5】排序算法的稳定性及其汇总

2022-05-07 20:02:49  阅读:221  来源: 互联网

标签:归并 复杂度 day5 稳定性 次序 快排 算法 排序


稳定性

定义:值相同的元素在排序完成之后能否保证原有的次序不变(同样值的个体之间,如果不因为排序而改变相对次序,这个排序就是有稳定性的,否则就没有)

举例:

[2,1,3,1]-->[1,1,2,3]
   ①   ②    ① ②

在排完序后,第一个1和第二个1的次序还是一样的

在基础数组中,排序的稳定性用处不大(因为都是数,没必要区分次序)

但是,在一些非基础数据的排序中就很有用

例如,现在有一堆学生的数据,含班级年龄两个属性

现要对其进行排序,可以通过比较器实现

按年龄从小到大排,排好后就得到一个年龄从小到大的数组

image-20220507190403299

之后我再按照班级从小到大排序

那么如果算法是稳定的,结果会得到一个按班级顺序排好的序,并且每个班级中的学生,年龄是从小到大的排序

image-20220507190730370

再举个例子,

购物网站排序,我们先选价格从低到高排序,再选择好评度从高到低排序,就会得到“物美价廉”的一个商品排序

这是排序算法稳定性的重要应用

不具备稳定性的排序:
选择排序(因为会涉及到相同数值位置的交换)

快速排序

image-20220507191622241

image-20220507191655762

堆排序

具备稳定性的排序:
冒泡排序(因为相邻两数相等时不交换)

插入排序(也可以做到,只要相邻两数相等时不交换)

归并排序(merge的时候遇到相等值先拷贝左边的,所有的拷完再拷右边的就可以)

一切桶排序思想下的排序

总结image-20220507192521587

能用快排就用快排;(快)

有空间限制就用堆排;(省内存)

对稳定性有需求用归并;(稳定性)

目前没有找到时间复杂度О(N*logN),额外空间复杂度0(1),又稳定的排序。

常见的坑

1,归并排序的额外空间复杂度可以变成0(1),但是非常难,不需要掌握,有兴趣可以搜“归并排序内部缓存法”

2,“原地归并排序”的帖子都是垃圾,会让归并排序的时间复杂度变成O(N^2)3,快速排序可以做到稳定性问题,但是非常难,不需要掌握,可以搜“O1 stable sort

4,所有的改进都不重要,因为目前没有找到时间复杂度O(N*logN),额外空间复杂度0(1),又稳定的排序。

5,有一道题目,是奇数放在数组左边,偶数放在数组右边,还要求原始的相对次序不变,碰到这个问题,可以怼面试官。可以用论文O1 stable sort的方法实现,但是很难,快排partition可以做到区分奇偶但是无法保证次序

工程上对排序的改进

1)充分利用О(N*logN)和O(N^2)排序各自的优势

例如,在一个大样本数据中先使用快排。等划分到比较小的范围之后(小于60)就转而使用插入排序。

等于是:快排用于调度,插入排序用于具体排序

2)稳定性的考虑

系统实现的排序方法在发现你的数据时基础类型是就会使用快排,发现是自定义类型(非基础类型)就会给你用归并,请问为什么?

答:

因为这是考虑了算法的稳定性。

基础类型无需稳定性,使用快排效率最高;

而自定义类型要满足可能需要的稳定性,所以用归并

标签:归并,复杂度,day5,稳定性,次序,快排,算法,排序
来源: https://www.cnblogs.com/DAYceng/p/16243938.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有