归并排序(非递归实现) 计数排序

news2024/12/23 6:24:34

上一期我们说了归并排序的递归是如何实现的,但是递归如果层次太多的话容易栈溢出,所以我们还需要掌握非递归的实现,但是我们非递归需要如何实现?

下面我们就来看一下非递归的实现

归并排序的非递归实现他并不需要栈队列这些东西来辅助实现非递归6718d7d9215645ec8df606c7609112ce.png,可以直接改为循环

这里我就直接说了,如果我们想改循环的话,我们可以想一下如何改成循环,我们想一下递归

递归的时候是先分为一个一个的数值,然后两个值进行比较,然后归并,然后就依次归并,那么我们想要循环,我们可不可以直接先让两个两个数字进行比较,所以我们这里可以直接让两个两个数字比较

就像这样

fea4aa447a9e4c4ba489e5644ea224e7.png

我们可以直接让两个两个数字进行比较,所以等一趟循环比较结束后

 6fec688b6e284129ac1ca54c849d4186.png

这一趟结束后,就两个两个已经归并结束,所以这时候我们就四个四个一起归并

ba0227c796ca4bae85a2412dca83fcc6.png 

就像这样,我们把2 4和1 6认为是两组数据,然后就让他们进行归并,同时后面的两组数据也是相同的

最后就是这样

79b765cd118b4bd2817d6ea4dd7d1583.png 

然后我们就让每四个为一组数据

8f52dff74f994067bc4e53ed72ded634.png 

就是这样,然后继续让他们进行归并

a3c19603d6bb44b299181ae21fbcbcf9.png 

最后就归并结束

好了这个就是思想,那么我们应该如何实现呢?

我们先浅浅的看一下代码

 e3ef1d9742354604901b47f2d9f906e0.png

我们还是需要一个临时数组的,用来存放归并时的临时数据,所以这时候我们就可以,定义一个gap,让gap从1开始变化,每一次都增加2,这样我们就可以实现,刚开始是一个一个排序,然后就是每两个两个排序,然后就是四个四个,知道gap大于n(整个数组的数据个数)就结束了

所以我们就可以实现归并

所以下面的代码就是这样 

7b6b3a35847b420ca714e47dbd016272.png

 

下面就是定义一个j初始为i,然后进行比较然后拷贝,这样就可以 ,等每一次归并结束后,把tmp里面的数据拷贝回原数组就可以了

但是真的是这样就结束了吗?

其实并不是,我们可以想一下,如果我们里面的数据并不是2的指数倍的时候是什么样子的,我们可以仔细想一下,我们此时的gap每一次都以2倍增加,所以我们肯定会有越界,所以我们这时候就需要对我们定义的begin1和end1以及begin2和end2进行调整

我们可以想一下

但是我们这四个变量都需要调整吗?

d8a442e72dc24811b05f5272fd16254e.png

这里我们看到我们这四个变量,那么我们四个变量都会越界吗?如果有哪些越界了我们需要调整呢?哪些越界之后我们还需要归并吗?哪些越界之后我们就不需要归并了,我们想一下

我们的begin1会不会越界?

显然不会的,因为我们的begin1每一次都是i而我们的i又是小于n的所以我们的begin1不会越界,但是我们的end1会越界吗?会的

所以,既然我们的end1都会越界,所以后面的两个也当然是会越界的,而我们这三个变量越界后的处理也当然是不一样的

如果我们的end1越界了,那么我们还需要对该数组进行归并吗?

我们想一下,如果我们的end1越界,说明我们只有一组甚至是一组都不到的数据,所以我们只有一组数据当然是不用归并的,那么我们的begin2越界呢?

如果我们的begin2越界,也说明我们只有一组数据,也是不用归并的,所以我们这里就可以直接不归并,那么我们的end2越界呢?

我们的end2越界,说明我们现在至少有一组多的数据,所以我们这里是需要归并的,那么我们应该怎么样调整呢?

我们可以看一下

29e06dd58d8748d19c7149f9731535bf.png 

和我们上面所说的一样,我们如果是end1或者begin2越界的话,说明我们只有一组数据,并不需要归并,如果我们的end2越界,说明我们有一组多的数据,是需要归并的,所以我们只需要把end2调整为不会越界就可以了

下面我们看一下整体的代码

4b8dd97885b74552b04f8462b40f1651.png 

其实上面只是一种写发,这种写法是每归并一次就拷贝一次,还有一种是一组全部归并好后,才进行拷贝,其实两种写法都是差不多的,这里把下面的一种也贴出来

d7a41ec963af41e485520fed40b2c069.png 

 OK 这就是归并排序的非递归,下面讲一下计数排序

我们前面说的几种排序都是比较排序,而计数排序是非比较排序

下面我们就来看一下计数排序,这里就直接说计数排序的思想以及用途了

这里的计数排序是特殊情况下使用的,可是他适用于什么情况呢?他适用于数字比较集中的排序,如果是这种情况他的时间复杂度特别好,已经能达到O(N),所以他在特定时候是特别厉害的

这里就说一下如何实现

计数排序他可以开一段数组,这段数组用来映射,就像这样

544638ada053423195f9cf113904bc83.png

如果我们是这一组数据的话,那么我们如何排序呢?

这里直接说思想,我们先开一段数组,然后把他里面初始化为0,然后这里把上面的一组数据依次遍历一遍,然后使用映射,下面看图片

 47e053af67c4485cb575d0194e6c244e.png

这里首先是0,然后再0位置++,然后遍历到下一个数字,

c5dcfcb8f6d84092bb6bc607aa57bf26.png

然后到5的位置++,就这样依次下去

327a135d0eb944b488745c49ccdcd0c4.png 

263bf89df5184be68a76fd7a614b96df.png 

然后是这样,知道这一组数字结束

但是这样是有缺点的

我们看图片

3cf32acff9e74214b1ab1d8f52696059.png 

 如果是这一组数据的话,那么我们可以看到,我们这一组数据会集中于后面

所以1e10b7d8387840aba126d7c6e418721a.png

 我们只能使用后面的这一组空间

ac64f0677669498dbf41802cc3d51285.png

 但是我们前面的这么多空间都会浪费掉,所以我们需要想一个解决办法

绝对映射会浪费太多的空间,那么我们就可以使用相对映射

我们可以这样

4f218efaacc44d21bb1c797c214cb974.png

我们就可以找到里面的最大值,和最小值,然后算出他们的差,然后我们就只需要开差距大小的空间就可以了,我们在计数排序的时候只需要让每个数字-掉最小值就可以了,就像这样

ed65254153444f37be9dd3490bf794af.png 

就是这样,所以我们现在可以直接看代码了

a33f43e7250f452f9bf3b71ce63c266e.png 

我们看明白思想之后看代码应该就是很容易了,所以这里也就不多解释

今天结束

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/422543.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

No.042<软考>《(高项)备考大全》【第26章】法律法规(合同法、招投标法、政府采购法、著作权法)

【第26章】法律法规(合同法、招投标法、政府采购法、著作权法)1 考试相关2 合同法练习题参考答案3 招投标法3.1 法规时间总结3.2 招投标流程3.3 招标3.4 投标3.5 评标3.6 练习题参考答案3.7 论文写作3.8 投标文件的编写应该注意哪些事项4 著作权法4.1 练…

找漏洞赚外快?给ChatGPT挑毛病,最高奖励14万

反正闲着也是闲着,不如来给ChatGPT找漏洞?毕竟,万一真的找到漏洞了还能赚一笔外快。 当地时间 4 月 11 日,OpenAI 宣布推出漏洞赏金计划。该公司将根据报告问题的严重性和影响提供现金奖励,奖励范围从 200 美元到 200…

Spring经典扩展接口应用:BeanPostProcessor

备注:新进行基本思路总结,四五月总结完 一、BeanPostProcessor基本知识总结 BeanPostProcessor是Bean级处理器,用于在bean实例化后、初始化后自定义修改bean实例,如属性校验、针对自定义bean做统一处理等。 BeanPostProcessor接…

实战:向人工智能看齐用Docker部署一个ChatGPT

文章目录前言鉴赏chatgpt环境要求开始搭建云安装docker从docker仓库拉取chatgpt-web镜像创建容器并运行chatgpt-web创建容器启动chatgpt-web访问自己的chatgpt总结前言 目前GPT-4都官宣步入多模态大型语言模型领域了,大佬竟然还没有体验GPT么。作为一个资深搬砖人士…

容器编排部署

一、概述 容器编排部署的作用: 实现复杂容器应用架构之间的互联,减少大量容器部署的成本 Docker"三剑客"编排部署 工具︰ docker machine 用于创建和管理docker host docker compose 通过一个文件定义复杂的容器应用之间的关系 容器与容…

【FMCW系统性能参数之测量精度公式推导】

本文编辑:调皮哥的小助理 连续多篇文章都在说FMCW雷达系统性能参数这个事儿,如: (1)从奈奎斯特采样定理推导FMCW雷达系统性能参数 (2)从FMCW毫米波雷达系统的性能参数理解4D成像毫米波雷达的设…

深度学习语义分割篇——FCN原理详解篇

🍊作者简介:秃头小苏,致力于用最通俗的语言描述问题 🍊往期回顾:目标检测系列——开山之作RCNN原理详解    目标检测系列——Fast R-CNN原理详解    目标检测系列——Faster R-CNN原理详解 🍊近期目标&…

Unity --- 3d数学 --- 坐标系统

1.世界坐标系是固定不动的 2.每一个游戏物体在世界坐标系中都有对应的坐标和方向 1.轴心点的位置不是固定的,是可以人为设定的 1.Screen Space --- 屏幕坐标 2.我们看到的屏幕其实就是相机所在的平面的位置 --- 而屏幕坐标系的Z其实就是游戏中的物体到相机平面的…

GDOUCTF

WEB hate eat snake 这是一个JS的题目,但是这个题目好像有点奇怪,不是很理解,当时我找到了我寝室JS的大哥,跟大哥说了一下我的思路,就是他根据这个time然后/1000转化为秒,就当作是我们玩游戏的一个分数&a…

速卖通韩国下载量再次登顶,7500万投资换来回报

韩国市场,还是一片蓝海。 速卖通终于等到了回报。 近日,数据平台 Data ai 显示,3 月 9 日以来,速卖通再次成为韩国购物 App 下载量第一名,超过当地电商平台 Coupang。 这或许和速卖通近日在韩国的布局有关。 前些天…

使用File System Access API 让浏览器可以操作文件

使用File System Access API 让浏览器可以操作文件 在早期我们开始学习前端三件套时,经常会听到这样的说法:浏览器是一个沙盒,它不允许我们操作本地文件,但是现在这个说法已经不再适用了,因为我们可以使用 File Syste…

2023接口自动化测试,完整入门篇

1. 什么是接口测试 顾名思义,接口测试是对系统或组件之间的接口进行测试,主要是校验数据的交换,传递和控制管理过程,以及相互逻辑依赖关系。其中接口协议分为HTTP,WebService,Dubbo,Thrift,Socket等类型,测试类型又主…

BBR算法

BBR算法 简述 bbr算法为google在2016年提出,用于改善tcp的性能,提升稳定性,降低延迟,更好地应对网络损伤。在整个算法调节周期中,bbr算法都在尽力维持最大bw和最小rtt。 对比传统的tcp算法 传统算法不能区分是拥塞导…

【RabbitMQ】Java操作RabbitMQ之入门Demo

目录 一、项目创建 二、生产者 三、消费者 一、项目创建 我们先在idea里创建两个Maven项目一个项目作为生产者&#xff0c;另一个作为消费者。创建完成后&#xff0c;在各自的pom.xml文件里引入Java使用RabbitMQ的依赖 <dependency><groupId>com.rabbitmq</g…

Android 单位和尺寸 以及ViewPager的使用

一 px 和 pt 1 px pixels 像素点 2 pt point 一个标准的长度单位&#xff0c;1pt 1/72英寸&#xff0c;用于印刷业&#xff0c;非常简单易用。 二 dp 和 sp 1 dp 就是 dip device independent pixels(设备独立像素) 不同设备有不同的显示效果。这个和设备硬件有关系&…

【数学推导找规律】全排列的价值【蓝桥杯13届】

欢迎观看我的博客&#xff0c;如有问题交流&#xff0c;欢迎评论区留言&#xff0c;一定尽快回复&#xff01;&#xff08;大家可以去看我的专栏&#xff0c;是所有文章的目录&#xff09;   文章字体风格&#xff1a; 红色文字表示&#xff1a;重难点★✔ 蓝色文字表示&#…

ChatGPT资讯—2023.4.14

一、 最新资讯 1. 国内大模型&#xff1a; 4月8日&#xff0c;华为云人工智能领域首席科学家田奇首次介绍了华为“盘古大模型”的进展及其应用。 紧接着4月10日&#xff0c;一天内三个大模型争相“官宣”&#xff0c;包括搜狗创始人王小川宣布即将投入创业的大模型产品名为“…

机器学习 day04(梯度下降算法,学习率,偏导数)

梯度下降 我们可以用一种更系统的方法&#xff0c;来找到一组w&#xff0c;b&#xff0c;使成本函数的值最小。这个方法叫梯度下降算法&#xff0c;它可用于最小化任何函数&#xff0c;不仅仅包括线性回归的成本函数&#xff0c;也包括两个以上参数的其他成本函数在线性回归中…

2023最新面试题-Java-4

Date相关 1. java8的Date相关API&#xff1a; 常用 api 1、 获取当前日期 LocalDate.now() 2、创建日期 LocalDate date LocalDate.of(2020, 9, 21) 3、获取年份 date.getYear()//通过 TemporalField 接口的实现枚举类 ChronoField.YEAR 获取年份 date.get(ChronoFie…

车载通信——J1939 DM1

诊断故障代码&#xff08;DTC&#xff09;由4 个独立域构成&#xff1a; a. 可疑参数的编号(SPN) 19位 b. 故障模式标志(FMI) 5位 c. 发生次数(OC) 7位 d. 可疑参数编号的转化方式(CM) 1 位 Byte1 – Lamp Status Bits1 – 2 Protection Lamp 保护灯状态 …