【数据结构】归并排序(不用递归)

大家好,我是苏貝,本篇博客带大家了解归并排序,如果你觉得我写的还不错的话,可以给我一个赞👍吗,感谢❤️
在这里插入图片描述


目录

归并排序(用递归)
之前我们写了一篇博客来介绍如何用递归实现归并排序,那么不用递归也可以实现归并排序吗?是的

初步非递归归并排序:

在这里插入图片描述

注意:上面的图只是为了方便看才感觉是在原数组上修改的,实际上是先比较2个数组,之后将这2个数组合成的数组存入额外的数组tmp中,之后再拷贝回原数组。

2个要合并成一个有序数组的下标怎么表示呢?我们来以gap==2举例:
begin1=i , end1=i+gap-1 ,begin2=i+gap ,end2=i+2*gap-1
在这里插入图片描述

代码如下:
但是这段代码有些问题,你能看出来吗?

void MergeSortNonR(int* a, int n)
{int* tmp = (int*)malloc(sizeof(int) * n);if (tmp == NULL){perror("malloc fail");return;}int gap = 1;while (gap < n){for (int i = 0; i < n; i = i + 2 * gap){int begin1 = i, end1 = i + gap - 1;int begin2 = i + gap, end2 = i + 2 * gap - 1;int j = begin1;while (begin1 <= end1 && begin2 <= end2){if (a[begin1] < a[begin2])tmp[j++] = a[begin1++];elsetmp[j++] = a[begin2++];}while (begin1 <= end1)tmp[j++] = a[begin1++];while (begin2 <= end2)tmp[j++] = a[begin2++];memcpy(a + i, tmp + i, sizeof(int) * (end2 - i + 1));}gap *= 2;}free(tmp);
}

问题:当原数组的数组元素不为2^n时,2个数组可能会越界,如下图:1还要与不是数组元素的值相比

在这里插入图片描述
所以我们要处理2个数组下标越界的可能

1. begin1越界
因为begin1被置为i,i<n,所以begin1不会越界
2. end1越界
就是上图的情况,此时第一个数组肯定有序,第二个数组肯定不存在,所以直接退出循环
3. begin2越界
begin2越界时,第二个数组肯定不存在,所以也不需要操作,直接退出循环
4. end2越界
当begin2没越界而end2越界时,只需将end2置为最后一个元素的下标n-1即可

代码:

void MergeSortNonR(int* a, int n)
{int* tmp = (int*)malloc(sizeof(int) * n);if (tmp == NULL){perror("malloc fail");return;}int gap = 1;while (gap < n){for (int i = 0; i < n; i = i + 2 * gap){int begin1 = i, end1 = i + gap - 1;int begin2 = i + gap, end2 = i + 2 * gap - 1;if (end1 >= n || begin2 >= n)break;if (end2 >= n)end2 = n - 1;int j = begin1;while (begin1 <= end1 && begin2 <= end2){if (a[begin1] < a[begin2])tmp[j++] = a[begin1++];elsetmp[j++] = a[begin2++];}while (begin1 <= end1)tmp[j++] = a[begin1++];while (begin2 <= end2)tmp[j++] = a[begin2++];memcpy(a + i, tmp + i, sizeof(int) * (end2 - i + 1));}gap *= 2;}free(tmp);
}

好了,那么本篇博客就到此结束了,如果你觉得本篇博客对你有些帮助,可以给个大大的赞👍吗,感谢看到这里,我们下篇博客见❤️

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

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

相关文章

工业无线网关在汽车制造企业的应用效果和价值-天拓四方

随着智能制造的快速发展&#xff0c;工业无线网关作为关键通信设备&#xff0c;在提升生产效率、优化生产流程、实现设备间的互联互通等方面发挥着越来越重要的作用。以下是一个关于工业无线网关在智能制造行业应用的具体案例&#xff0c;展示了其在实际生产中的应用效果和价值…

某易盾解析滑块 【2024/03/27】

文章目录 文章目录 文章目录前言网址请求图片 actoken获取图片 cb轨迹验证gdxidpyhxde 也就是fp前言 可以关注我哟,一起学习,主页有更多练习例子 如果哪个练习我没有写清楚,可以留言我会补充 如果有加密的网站可以留言发给我,一起学习共享学习路程 如侵权,联系我删除 此文…

fastadmin学习01-windows下安装部署

下载源代码 官网 安装 解压&#xff0c;然后使用phpstorm打开 修改配置文件 创建数据库 -- drop database fastadmin01; create database fastadmin01;这样fastadmin就部署好了 访问主页也能看到前台页面

进行接口测试时,连接数据库,对数据源进行备份、还原、验证操作

进行接口测试时&#xff0c;我们需要连接到数据库中&#xff0c;对数据源进行备份、还原、验证等操作。 一、Python连接数据库常见模块 MysqlDBpython2时代最火的驱动库。基于C开发&#xff0c;对windows平台不友好。现在已经进入python3时代&#xff0c;基本不再使用MysqlCl…

C#特性和反射(一)

特性和反射 特性&#xff08;Attribute&#xff09; 特性&#xff08;Attribute&#xff09;是用于在运行时传递程序中各种元素&#xff08;比如类、方法、结构、枚举、组件等&#xff09;的行为信息的声明性标签。可以通过使用特性向程序添加声明性信息。一个声明性标签是通…

Vue3气泡卡片(Popover)

效果如下图&#xff1a;在线预览 APIs 参数说明类型默认值必传title卡片标题string | slot‘’falsecontent卡片内容string | slot‘’falsemaxWidth卡片内容最大宽度string | number‘auto’falsetrigger卡片触发方式‘hover’ | ‘click’‘hover’falseoverlayStyle卡片样式…

Qt/QML编程之路:画线及倒车影响(48)

前言: 倒车影像中有一个属性比较实用,那就是倒车线,这条线很明显会在视频图像上叠加显示,或者说在视频上面一个图层画的线。这里有一个画线的Qt示例,用于在一个scene上画一个对角线: #include "mainwindow.h" #include <QApplication> #include <QtW…

在VUE页面调用Extjs中定义的方法

VUE版本&#xff1a;VUE2 EXTJS版本&#xff1a;4.2.6 1、在extjs页面上写监听事件&#xff08;主要利用了window.addEventListener来监听message事件 window.addEventListener("message", function(event) {// 这里写监听到消息后的逻辑 }, false); 2、在VUE中调…

python接口自动化测试 之mock模块基本使用介绍

mock作用 解决依赖问题&#xff0c;达到解耦作用 当我们测试某个目标接口&#xff08;模块&#xff09;时&#xff0c;该接口依赖其他接口&#xff0c;当被依赖的接口未开发完成时&#xff0c;可以用mock模拟被依赖接口&#xff0c;完成目标接口的测试 模拟复杂业务的接口 …

argocd部署

一、前言 ArgoCD 是一个开源的、持续交付工具&#xff0c;用于自动化部署应用程序到 Kubernetes 集群。它基于 GitOps 理念&#xff0c;通过使用 Git 作为单一的源头来管理应用程序的配置和部署状态&#xff0c;argocd会定时监控git仓库中的yaml配置文件&#xff0c;当git仓库中…

APIKit探索之旅:bug拦截

在软件系统的质量保证上&#xff0c;有多种方式&#xff0c;这次尝试是通过ApiKit&#xff0c;在接口层面&#xff0c;对系统开发过程中可能产生的bug进行拦截。 接口测试是软件开发中不可或缺的一环&#xff0c;它能够有效地检测出系统间数据传输的错误。个人认为&#xff0c…

案例分享|智能机器人空调压缩机曲轴轴套装配

随着空调市场的不断扩大和消费者对于空调性能要求的提高&#xff0c;空调压缩机的制造质量也日益受到关注。作为压缩机核心部件之一的曲轴轴套&#xff0c;其装配质量直接关系到压缩机的性能和稳定性。 一、案例背景 某知名空调制造商在生产某型号压缩机时&#xff0c;发现曲轴…

面向对象编程(二)

文章目录 __name__ 属性__doc__属性__bases__属性__module__属性__class__属性__init__()函数__new__()函数__del__()函数 name 属性 在Python的类定义中&#xff0c;name 属性通常不是用来描述类本身的&#xff0c;而是用来描述类实例的。当我们讨论类的属性时&#xff0c;na…

2024年3月GESP等级认证C++编程五级真题

2024年3月GESP认证C编程五级真题试卷 题目总数&#xff1a;27 总分数&#xff1a;100 选择题 第 1 题 单选题 唯⼀分解定理描述的内容是 ( ) ? A.任意整数都可以分解为素数的乘积 B.每个合数都可以唯⼀分解为⼀系列素数的乘积 C.两个不同的整数可以分解为相同…

初步接触C++

hello&#xff0c;各位小伙伴&#xff0c;本篇文章跟大家一起学习C&#xff0c;感谢大家对我上一篇的支持&#xff0c;如有什么问题&#xff0c;还请多多指教 &#xff01; 文章目录 初步区别C语言和C命名空间1.命名空间的定义2.命名空间的使用 C的输入输出缺省参数1.缺省参数…

http协议中缓存Cache-Control详解

Cache-Control 是一个 HTTP/1.1 协议中的头部字段&#xff0c;用于指定请求和响应遵循的缓存机制。通过这个头部&#xff0c;服务器可以告诉客户端响应可以被缓存多长时间&#xff0c;以及在什么条件下可以被缓存和重新使用。以下是一些常见的 Cache-Control 指令&#xff1a; …

机器学习——神经网络简单了解

一、神经网络基本概念 神经网络可以分为生物神经网络和人工神经网络 (1)生物神经网络,指的是生物脑内的神经元、突触等构成的神经网络&#xff0c;可以使生物体产生意识&#xff0c;并协助生物体思考、行动和管理各机体活动。 (2)人工神经网络,是目前热门的深度学习的研究…

计算坤是如何工作的

White graces&#xff1a;个人主页 &#x1f649;专栏推荐:Java入门知识&#x1f649; &#x1f649; 内容推荐:&#x1f649; &#x1f439;今日诗词:&#x1f439; ⛳️点赞 ☀️收藏⭐️关注&#x1f4ac;卑微小博主&#x1f64f; ⛳️点赞 ☀️收藏⭐️关注&#x1f4ac…

进程、线程、协程与虚拟线程(进程相关)

进程、线程、协程与虚拟线程 这一次我们从头&#xff0c;从最大的先开始说&#xff0c;我们从进程开始&#xff0c;因为内容比较多&#xff0c;所以我们分为几个不同的文章来介绍。先从进程&#xff0c;再从线程&#xff0c;最后介绍协程与虚拟线程。 简介 我们以一张操作系…

ehters.js:provider

ethers.jsV5.4文档 安装ethers npm install ethers5.4.0// 引入 import { ethers } from ethersProviders /** Provider类* Provider类是对以太坊网络连接的抽象&#xff0c;为标准以太坊节点功能提供简洁、一致的接口。 */ const provider new ethers.providers.Web3Provider…