当前位置: 首页 > article >正文

数据结构基础之《(15)—排序算法小结》

一、排序算法的稳定性

1、稳定性是指同样大小的样本再排序之后不会改变相对次序

2、对基础类型来说,稳定性毫无意义
比如:3和3没有区别。《潜伏》里说同样两个一百元大钞,你能告诉我哪一个是高尚的那一个是龌龊的么

3、对非基础类型来说,稳定性有重要意义
比如:有很多个学生,学生有班级号和年龄
第一回按年龄从小到大排序
得到一个序列,年龄是从小到大的
基于这个序列,再按照班级号从小到大排序
排完之后,如果排序有稳定性的,在1班的学生内部,年龄是从小到大排序的

4、有些排序算法可以实现成稳定的,而有些排序算法无论如何都实现不成稳定的

5、什么算法是稳定的,什么算法是不稳定的
(1)选择排序
没有稳定性,因为它是从0到n-1中找最小值,然后交换
例子:
[5 5 5 5 5 5 1 5 5 5 5]
第一个5和1交换,第一个5会跑到后面几个5的后面,原序列中两个5的相对前后顺序就被破坏了

(2)冒泡排序
有稳定性
处理相等时的态度,就决定了它稳定性能不能实现
相等时不交换,稳定性不会破坏

(3)插入排序
有稳定性

(4)归并排序
有稳定性

(5)快速排序
没有稳定性

(6)堆排序
没有稳定性,因为堆结构根本不考虑稳定不稳定

二、小结

1、排序算法总结

时间复杂度额外空间复杂度稳定性
选择排序O(N^2)O(1)
冒泡排序O(N^2)O(1)
插入排序O(N^2)O(1)
归并排序O(N*logN)O(N)
随机快排O(N*logN)O(logN)
堆排序O(N*logN)O(1)
计数排序O(N)O(M)
基数排序O(N)O(N)

(1)不基于比较的排序,对样本数据有严格要求,不易改写
(2)基于比较的排序,只要规定好两个样本怎么比大小就可以直接复用
(3)基于比较的排序,时间复杂度的极限是O(N*logN)
(4)时间复杂度O(N*logN)、额外空间复杂度低于O(N)、且稳定的基于比较的排序是不存在的
(5)为了绝对的速度选快排、为了省空间选堆排、为了稳定性选归并

2、常见的坑
(1)归并排序的额外空间复杂度可以变成O(1),“归并排序 内部缓存法”,但是将变得不再稳定
没必要,直接用堆排序
(2)“原地归并排序”是垃圾,会让时间复杂度变成O(N^2)
没必要,直接用插入排序
(3)快速排序稳定性改进,“01 stable sort”,但是会对样本数据要求更多
没必要,论文里的,限制条件很多

3、工程上对排序的改进
(1)稳定性的考虑
(2)充分利用O(N*logN)和O(N^2)排序各自的优势

例如Java中Arrays.sort()方法:
它会先做个反射,你让我排序的东西,是以值传递的还是以引用传递的
如果以值传递,直接快排
如果以引用排序,会用归并排序
考虑到稳定性
 


http://www.kler.cn/a/519675.html

相关文章:

  • 粒子群算法 笔记 数学建模
  • 【Linux】21.基础IO(3)
  • Flink把kafa数据写入Doris的N种方法及对比。
  • debian12.9编译freeswitch1.10.12【默认安装】
  • 网络模型简介:OSI七层模型与TCP/IP模型
  • ThreeJS示例教程200+【目录】
  • MATLAB 如何避免复杂shp文件对inpolygon的影响
  • 3大关键点教你用Java和Spring Boot快速构建微服务架构:从零开发到高效服务注册与发现的逆袭之路
  • 不建模,无代码,如何构建一个3D虚拟展厅?
  • 【前端】CSS实战之音乐播放器
  • InceptionV1_V2
  • 贝尔科技液氮罐确保每一份样本的保存达标
  • 【Rust自学】14.3. 使用pub use导出方便使用的API
  • 算法每日双题精讲 —— 二分查找(山脉数组的峰顶索引,寻找峰值)
  • 使用 MySQL JSON 查询筛选嵌套字段的值
  • IMX6ull项目环境配置
  • [ACTF2020 新生赛]Include1
  • 服务器中热备份和冷备份的区别
  • Debian或Ubuntu系统中重置MySQL的root密码
  • 【2024年华为OD机试】 (C卷,200分)- 贪吃的猴子(JavaScriptJava PythonC/C++)
  • Solon Cloud Gateway 开发:熟悉 Completable 响应式接口
  • 【力扣Hot 100】矩阵2
  • Avalonia+ReactiveUI跨平台路由:打造丝滑UI交互的奇幻冒险
  • 文献阅读记录8--Enhanced Machine Learning Sketches for Network Measurements
  • UE4通过反射获取蓝图或子类属性值
  • PAT甲级-1023 Have Fun with Numbers