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

11.1 排序算法

目录

11.1   排序算法

11.1.1   评价维度

11.1.2   理想排序算法


11.1   排序算法

排序算法(sorting algorithm)用于对一组数据按照特定顺序进行排列。排序算法有着广泛的应用,因为有序数据通常能够被更高效地查找、分析和处理。

如图 11-1 所示,排序算法中的数据类型可以是整数、浮点数、字符或字符串等。排序的判断规则可根据需求设定,如数字大小、字符 ASCII 码顺序或自定义规则。

数据类型和判断规则示例

图 11-1   数据类型和判断规则示例

11.1.1   评价维度

运行效率:我们期望排序算法的时间复杂度尽量低,且总体操作数量较少(时间复杂度中的常数项变小)。对于大数据量的情况,运行效率显得尤为重要。

就地性:顾名思义,原地排序通过在原数组上直接操作实现排序,无须借助额外的辅助数组,从而节省内存。通常情况下,原地排序的数据搬运操作较少,运行速度也更快。

稳定性稳定排序在完成排序后,相等元素在数组中的相对顺序不发生改变。

稳定排序是多级排序场景的必要条件。假设我们有一个存储学生信息的表格,第 1 列和第 2 列分别是姓名和年龄。在这种情况下,非稳定排序可能导致输入数据的有序性丧失:

# 输入数据是按照姓名排序好的
# (name, age)('A', 19)('B', 18)('C', 21)('D', 19)('E', 23)# 假设使用非稳定排序算法按年龄排序列表,
# 结果中 ('D', 19) 和 ('A', 19) 的相对位置改变,
# 输入数据按姓名排序的性质丢失('B', 18)('D', 19)('A', 19)('C', 21)('E', 23)

自适应性自适应排序的时间复杂度会受输入数据的影响,即最佳时间复杂度、最差时间复杂度、平均时间复杂度并不完全相等。

自适应性需要根据具体情况来评估。如果最差时间复杂度差于平均时间复杂度,说明排序算法在某些数据下性能可能劣化,因此被视为负面属性;而如果最佳时间复杂度优于平均时间复杂度,则被视为正面属性。

是否基于比较基于比较的排序依赖比较运算符(<、=、>)来判断元素的相对顺序,从而排序整个数组,理论最优时间复杂度为 𝑂(𝑛log⁡𝑛) 。而非比较排序不使用比较运算符,时间复杂度可达 𝑂(𝑛) ,但其通用性相对较差。

11.1.2   理想排序算法

运行快、原地、稳定、正向自适应、通用性好。显然,迄今为止尚未发现兼具以上所有特性的排序算法。因此,在选择排序算法时,需要根据具体的数据特点和问题需求来决定。

接下来,我们将共同学习各种排序算法,并基于上述评价维度对各个排序算法的优缺点进行分析。

相关文章:

  • C++中的智能指针类别
  • 汽车MCU虚拟化--对中断虚拟化的思考(1)
  • 利用GNSS IMU集成提高车道级定位精度
  • Blueprints - Collision Presets相关
  • 4月啤酒品类线上销售数据分析
  • Java-集合基础
  • LeetCode # 1070. 产品销售分析 III
  • Python列表
  • RustDesk服务器
  • 整理GTX收发器示例工程(高速收发器十一)
  • 医院该如何应对网络安全?
  • Redis缓存(笔记一:缓存介绍和数据库启动)
  • C. Turtle and an Incomplete Sequence
  • 一维时间序列信号的改进小波降噪方法(MATLAB R2021B)
  • 【记录43】el-table @selection-change 数据回显、条件约束、历史回显清除
  • Google 是如何开发 Web 框架的
  • $translatePartialLoader加载失败及解决方式
  • 「前端早读君006」移动开发必备:那些玩转H5的小技巧
  • 【跃迁之路】【585天】程序员高效学习方法论探索系列(实验阶段342-2018.09.13)...
  • 〔开发系列〕一次关于小程序开发的深度总结
  • 08.Android之View事件问题
  • classpath对获取配置文件的影响
  • FineReport中如何实现自动滚屏效果
  • GDB 调试 Mysql 实战(三)优先队列排序算法中的行记录长度统计是怎么来的(上)...
  • Javascript设计模式学习之Observer(观察者)模式
  • WePY 在小程序性能调优上做出的探究
  • 二维平面内的碰撞检测【一】
  • 解决jsp引用其他项目时出现的 cannot be resolved to a type错误
  • 前端
  • 前端_面试
  • 浅谈Golang中select的用法
  • 浅谈Kotlin实战篇之自定义View图片圆角简单应用(一)
  • 如何打造100亿SDK累计覆盖量的大数据系统
  • 如何用Ubuntu和Xen来设置Kubernetes?
  • 深入浅出webpack学习(1)--核心概念
  • 推荐一款sublime text 3 支持JSX和es201x 代码格式化的插件
  • 正则与JS中的正则
  • 阿里云ACE认证学习知识点梳理
  • 摩拜创始人胡玮炜也彻底离开了,共享单车行业还有未来吗? ...
  • ​猴子吃桃问题:每天都吃了前一天剩下的一半多一个。
  • ​软考-高级-系统架构设计师教程(清华第2版)【第15章 面向服务架构设计理论与实践(P527~554)-思维导图】​
  • #FPGA(基础知识)
  • #NOIP 2014# day.1 T2 联合权值
  • ( 10 )MySQL中的外键
  • (翻译)Quartz官方教程——第一课:Quartz入门
  • (附源码)ssm基于web技术的医务志愿者管理系统 毕业设计 100910
  • (离散数学)逻辑连接词
  • (七)Flink Watermark
  • (十三)Flask之特殊装饰器详解
  • (一)为什么要选择C++
  • (总结)(2)编译ORB_SLAM2遇到的错误
  • .equals()到底是什么意思?
  • .form文件_SSM框架文件上传篇
  • .NET CF命令行调试器MDbg入门(二) 设备模拟器
  • .NET Core 通过 Ef Core 操作 Mysql