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

数据结构与算法 第12天(排序)

一、排序方法分类

按照数据存储介质

内部排序:数据量不大、数据在内存,无需内外存交换数据

外部排序:数据量较大、数据在外存(文件排序)

将数据分批调入内存排序,结果放到外存

按照比较器个数:

串行排序:单处理机(同一时刻比较一对元素)

并行排序:多处理机(同一时刻比较多对元素)

按主要操作:

比较排序:用比较的方法

插入排序、交换排序、选择排序、归并排序

基数排序:不比较元素的大小,仅仅根据元素本身的取值确定其有序位置

按辅助空间:

原地排序:辅助空间用量为O(1)的排序方法。

非原地排序:辅助空间用量超过O(1)的排序方法

按稳定性:

稳定排序:能够使任何数值相等的元素,排序以后相对次序不变

非稳定排序:不是稳定排序的方法。

例子:

排序的稳定性只对结构类型数据排序有意义,不能衡量一个算法的优劣

按自然性:

自然排序:输入数据越有序排序的速度越快的排序方法。

非自然排序:不是自然排序的方法。

二、插入排序

类似于扑克牌插牌,便插入边排序

顺序法

每循环一次,需要比较两次,可以使用哨兵,简化算法

算法

二分法

希尔排序

缩小增量多遍插入排序

先将整个待排记录席列分割成若干子序列,分别进行直接插入排序待整个序列中的记录“基本有序”时,再对全体记录进行一次直接插入排序。

希尔排序是不稳定的

算法

三、交换排序

冒泡排序

每趟不断将记录两两比较,并按规则交换,每一趟排好一个,是稳定的

n个元素需要n-1趟,第m趟需要比较n-m次

算法

优点:每趟结束时,不仅能挤出一个最大值到最后面位置,还能同时理顺其他元素

优化:某次没有交换就说明已经排好序了

给算法加一个标记

快速排序

不是原地排序,是一种不稳定的算法,是所有内排序中最优的

不适于对基本有序的序列排序,会退化成冒泡排序

思路

从后面找比49小的放前面,后面就会空一个

再从前面找一个比49大的放后面,前面就会空一个,以此类推

算法

四、选择排序

简单选择排序

在待排序的数据中选出最大(小)的元素放在其最终的位置,是不稳定排序

基本操作

1.首先通过n-1次关键字比较,从n个记录中找出关键字最小的记录,将它与第一个记录交换
2.再通过n-2次比较,从剩余的n-1个记录中找出关键字次小的记录,将
它与第二个记录交换
3.重复上述操作,共进行n-1趟排序后,排序结束

算法

堆排序

概念

堆实质是满足完全二叉树的性质

完全二叉树:二叉树中任一非叶子结点均小于(大于)它的孩子结点

不稳定

堆排序

大根堆的根是最大值,小根堆的值是最小值

实现堆排序需解决两个问题:

1、如何由一个无序序列建成一个堆?

对一个无序数列反复进行筛选

例子

2、如何在输出堆顶元素后,调整剩余元素为一个新的堆?

小根堆:

筛选算法

堆的建立

算法

五、归并排序

二路归并排序

思想:

将两个或两个以上的有序子序列“归并”为一个有序序列

是一个稳定排序

例子

归并树

算法

简单了解一下

六、基数排序

思想:

分配+收集

是稳定的

例子

在分别按照,十位百位分配收集,最终得到有序数列

七、各种排序比较

时间性能

空间性能

稳定性能

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • python之对象间的关系
  • 14.2 k8s中我们都需要监控哪些组件
  • C#/.NET/.NET Core推荐学习路线文档文章
  • Linux新建虚拟机Ubuntu详解
  • Linux:软硬连接和动静态库
  • PhotoZoom9怎么样?图片模糊怎么办?
  • navigator.mediaDevices.getUserMedia检查用户的摄像头是否可用,虚拟摄像头问题
  • 基于MinerU的PDF解析API
  • AUC真的什么情形下都适合吗
  • COD论文笔记 BiRefNet
  • Spark MLlib模型训练—聚类算法 PIC(Power Iteration Clustering)
  • Python | Leetcode Python题解之第386题字典序排数
  • 图文解析保姆级教程:Postman专业接口测试工具的安装和基本使用
  • ChatGPT 3.5/4.0使用手册:解锁人工智能的无限潜能
  • nginx配置负载均衡的几种方式
  • “Material Design”设计规范在 ComponentOne For WinForm 的全新尝试!
  • 《Javascript高级程序设计 (第三版)》第五章 引用类型
  • 【JavaScript】通过闭包创建具有私有属性的实例对象
  • 30秒的PHP代码片段(1)数组 - Array
  • iOS帅气加载动画、通知视图、红包助手、引导页、导航栏、朋友圈、小游戏等效果源码...
  • Java应用性能调优
  • Laravel 实践之路: 数据库迁移与数据填充
  • Linux后台研发超实用命令总结
  • SQLServer插入数据
  • Vue2.x学习三:事件处理生命周期钩子
  • 等保2.0 | 几维安全发布等保检测、等保加固专版 加速企业等保合规
  • 好的网址,关于.net 4.0 ,vs 2010
  • 你真的知道 == 和 equals 的区别吗?
  • 盘点那些不知名却常用的 Git 操作
  • 七牛云 DV OV EV SSL 证书上线,限时折扣低至 6.75 折!
  • 前端学习笔记之原型——一张图说明`prototype`和`__proto__`的区别
  • 视频flv转mp4最快的几种方法(就是不用格式工厂)
  • 学习笔记:对象,原型和继承(1)
  • [Shell 脚本] 备份网站文件至OSS服务(纯shell脚本无sdk) ...
  • 【干货分享】dos命令大全
  • 哈罗单车融资几十亿元,蚂蚁金服与春华资本加持 ...
  • 摩拜创始人胡玮炜也彻底离开了,共享单车行业还有未来吗? ...
  • ​一、什么是射频识别?二、射频识别系统组成及工作原理三、射频识别系统分类四、RFID与物联网​
  • #Ubuntu(修改root信息)
  • #我与Java虚拟机的故事#连载17:我的Java技术水平有了一个本质的提升
  • (02)Hive SQL编译成MapReduce任务的过程
  • (2)nginx 安装、启停
  • (2)从源码角度聊聊Jetpack Navigator的工作流程
  • (3)Dubbo启动时qos-server can not bind localhost22222错误解决
  • (3)选择元素——(14)接触DOM元素(Accessing DOM elements)
  • (ibm)Java 语言的 XPath API
  • (javaweb)Http协议
  • (k8s)Kubernetes 从0到1容器编排之旅
  • (附源码)ssm高校志愿者服务系统 毕业设计 011648
  • (十二)springboot实战——SSE服务推送事件案例实现
  • (转)memcache、redis缓存
  • (转)socket Aio demo
  • ./mysql.server: 没有那个文件或目录_Linux下安装MySQL出现“ls: /var/lib/mysql/*.pid: 没有那个文件或目录”...
  • .NET 4.0中的泛型协变和反变
  • .NET Core 将实体类转换为 SQL(ORM 映射)