【数据结构】手撕归并排序(含非递归)

目录

一,归并排序(递归)

1,基本思想

 2,思路实现

二,归并排序(非递归)

1,思路实现

2,归并排序的特性总结:


一,归并排序(递归)

1,基本思想

归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用;

已有序的子序列合并,得到完全有序的序列;

先使每个子序列有序,再使子序列段间有序,将两个有序表合并成一个有序表,称为二路归并;

归并排序核心步骤:

 2,思路实现

这个归并排序乍一看像一颗二叉树,事实也是如此,如上图所示我们需要不断的拆分直至拆成一个元素此时就是有序的然后再合并合并的时候不要选择原地合并(原地合并时间复杂度很高)需要开辟与数组同等大小的空间用来存放数据

主函数整体框架:

//归并排序
void MergerSort(int* arr, int begin, int end)
{if (begin >= end){return;}//开辟同等大小数组int* tmp = (int*)malloc((end - begin + 1)*sizeof(int));//归并Merger(arr, tmp, begin, end);free(tmp);tmp = NULL;
}

然后我们就要开始实现 Merger 函数,是数据归并了;

把数组拆分成一个数据后开始合并,刚开始一 一合并,然后二 二合并,然后四 四合并,直至全数组合并完;

//归并
void Merger(int* arr, int* tmp,int begin,int end)
{int mid = (begin + end) / 2;if (begin == end){return;}//排序【begin,mid】& 【mid+1,end】Merger(arr, tmp, begin,mid);Merger(arr, tmp, mid+1, end);int begin1 = begin, end1 = mid;int begin2 = mid + 1, end2 = end;int i = 0;while (begin1 <= end1 && begin2 <= end2){if (arr[begin1] <= arr[begin2]){tmp[i++] = arr[begin1++];}else{tmp[i++] = arr[begin2++];}}while(begin1 <= end1){tmp[i++] = arr[begin1++];}while (begin2 <= end2){tmp[i++] = arr[begin2++];}//进行拷贝memcpy(arr + begin, tmp, (end - begin+1)*sizeof(int));
}

然后我们运行测试一下:

可以看到是有序的,选择排序就 OK 了;

其实跟二叉树的前序遍历有异曲同工之处,前后知识都是连贯起来的;

二,归并排序(非递归)

1,思路实现

现在我们来拿捏一下非递归版的归并排序,其实也还是换汤不换药;

其实新思路是这个图的下半部分,我们先让数据一 一合并,然后再二 二合并,然后再四 四合并程倍数增长有人问如果越界了怎么办?没关系我们后面会做越界处理的

直接上代码!

//归并排序(非递归)
void MergerSortNon(int* arr, int begin, int end)
{if (begin >= end){return;}//开辟同等大小数组int* tmp = (int*)malloc((end - begin + 1) * sizeof(int));int gap = 1;int j = 0;while (gap < end){for (j = 0; j < end; j += 2 * gap){int begin1 = j, end1 = begin1+gap-1;int begin2 =end1+1, end2 = begin2+gap-1;int i = 0;//处理边界问题if (end1 >= end){break;}if (end2 >end){end2 = end;}while (begin1 <= end1 && begin2 <= end2){if (arr[begin1] <= arr[begin2]){tmp[i++] = arr[begin1++];}else{tmp[i++] = arr[begin2++];}}while (begin1 <= end1){tmp[i++] = arr[begin1++];}while (begin2 <= end2){tmp[i++] = arr[begin2++];}//进行拷贝memcpy(arr + j, tmp, (end2 - j+ 1) * sizeof(int));}gap *= 2;}free(tmp);tmp = NULL;
}

我们来运行测试一下:

可以看到是有序的,选择排序就 OK 了;

2,归并排序的特性总结:

1, 归并的缺点在于需要O(N)的空间复杂度,归并排序的思考更多的是解决在磁盘中的外排序问题

2, 时间复杂度:O(N*logN)

3, 空间复杂度:O(N)

4, 稳定性:稳定

第四阶段就到这里了,带大家继续吃肉!

后面博主会陆续更新;

如有不足之处欢迎来补充交流!

完结。。

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

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

相关文章

面试题:在大型分布式系统中,给你一条 SQL,让你优化,你会怎么做?

亲爱的小伙伴们&#xff0c;大家好呀&#xff01;我是小米&#xff0c;一个热爱技术、乐于分享的90后程序猿。今天&#xff0c;我要和大家聊聊一个在大型分布式系统中非常有趣和挑战性的话题——如何优化 SQL 查询&#xff01; 这个问题可不简单&#xff0c;但不要担心&#x…

力扣第100题 相同的数 c++ 二叉 简单易懂+注释

题目 100. 相同的树 简单 给你两棵二叉树的根节点 p 和 q &#xff0c;编写一个函数来检验这两棵树是否相同。 如果两个树在结构上相同&#xff0c;并且节点具有相同的值&#xff0c;则认为它们是相同的。 示例 1&#xff1a; 输入&#xff1a;p [1,2,3], q [1,2,3] 输出…

除静电离子风嘴的工作原理及应用

除静电离子风嘴是一种常见的除静电设备&#xff0c;它的工作原理是通过产生大量的负离子来中和物体表面的静电电荷&#xff0c;从而达到除静电的目的。 除静电离子风嘴内部装有一个电离器&#xff0c;电离器会将空气中的氧气分子或水分子电离成正、负离子。这些带电的离子在空…

工信部教考中心:什么是《研发效能(DevOps)工程师》认证,拿到证书之后有什么作用!(上篇)丨IDCF

在计算机行业中&#xff0c;资质认证可以证明在该领域内的专业能力和知识水平。各种技术水平认证也是层出不穷&#xff0c;而考取具有公信力和权威性的认证是从业者的首选。同时&#xff0c;随着国内企业技术实力的提升和国家对于自主可控的重视程度不断提高&#xff0c;国产证…

android 获取局域网其他设备ip

Android 通过读取本地Arp表获取当前局域网内其他设备信息_手机查看arp-CSDN博客

铭控传感亮相2023国际物联网展,聚焦“多场景物联感知方案”应用

金秋九月&#xff0c;聚焦IoT基石技术&#xff0c;荟萃最全物联感知企业&#xff0c;齐聚IOTE 2023第20届国际物联网展深圳站。铭控传感携智慧楼宇&#xff0c;数字工厂&#xff0c;智慧消防&#xff0c;智慧泵房等多场景物联感知方案及多品类无线传感器闪亮登场&#xff0c;现…

做外贸独立站选Shopify还是WordPress?

现在确实会有很多新人想做独立站&#xff0c;毕竟跨境电商平台内卷严重&#xff0c;平台规则限制不断升级&#xff0c;脱离平台“绑架”布局独立站&#xff0c;才能获得更多流量、订单、塑造品牌价值。然而&#xff0c;在选择建立外贸独立站的过程中&#xff0c;选择适合的建站…

90、Redis 的 value 所支持的数据类型(String、List、Set、Zset、Hash)---->Hash 相关命令

本次讲解要点&#xff1a; Hash 相关命令&#xff1a;是指value中的数据类型 启动redis服务器&#xff1a; 打开小黑窗&#xff1a; C:\Users\JH>e: E:>cd E:\install\Redis6.0\Redis-x64-6.0.14\bin E:\install\Redis6.0\Redis-x64-6.0.14\bin>redis-server.exe red…

如何让FileBeat支持http的output插件

目录 1 缘由2 编译filebeat3 配置虚拟机访问外网4 编译beats-output-http4.1 使用本地包4.2 发布在线包 5 测试6 beats-output-http的部分解释 1 缘由 官网的filebeat只有以下几种output插件&#xff1a; Elasticsearch ServiceElasticsearchLogstashKafkaRedisFileConsole …

探索JavaScript事件流:DOM中的神奇旅程

&#x1f3ac; 江城开朗的豌豆&#xff1a;个人主页 &#x1f525; 个人专栏 :《 VUE 》 《 javaScript 》 ⛺️ 生活的理想&#xff0c;就是为了理想的生活 ! 目录 引言 1. 事件流的发展流程 1.1 传统的DOM0级事件 1.2 DOM2级事件和addEventListener方法 1.3 W3C DOM3级…

黑马mysql教程笔记(mysql8教程)基础篇——数据库相关概念、mysql安装及卸载、数据模型、SQL通用语法及分类(DDL、DML、DQL、DCL)

参考文章1&#xff1a;https://www.bilibili.com/video/BV1Kr4y1i7ru/ 参考文章2&#xff1a;https://dhc.pythonanywhere.com/article/public/1/ 文章目录 基础篇数据库相关概念&#xff08;数据库DataBase&#xff08;DB&#xff09;、数据库管理系统DataBase Management Sy…

HarmonyOS学习路之方舟开发框架—学习ArkTS语言(渲染控制 一)

渲染控制概述 ArkUI通过自定义组件 的build()函数和builder装饰器 中的声明式UI描述语句构建相应的UI。在声明式描述语句中开发者除了使用系统组件外&#xff0c;还可以使用渲染控制语句来辅助UI的构建&#xff0c;这些渲染控制语句包括控制组件是否显示的条件渲染语句&#x…

day-64 代码随想录算法训练营(19)图论 part 03

827.最大人工岛 思路一&#xff1a;深度优先遍历 1.深度优先遍历&#xff0c;求出所有岛屿的面积&#xff0c;并且把每个岛屿记上不同标记2.使用 unordered_map 使用键值对&#xff0c;标记&#xff1a;面积&#xff0c;记录岛屿面积3.遍历所有海面&#xff0c;然后进行一次广…

JavaScript 在前端开发中有什么应用?

JavaScript&#xff08;简称JS&#xff09;是一种脚本语言&#xff0c;广泛应用于前端开发中。作为Web前端三大基石之一&#xff08;HTML、CSS、JS&#xff09;&#xff0c;它可以使网页具备交互性、动态性和实时性&#xff0c;提高用户体验。在本文中&#xff0c;我将详细论述…

机器学习-Pytorch基础

Numpy和Pytorch可以相互转换&#xff0c;前者CPU上&#xff0c;后者GPU上&#xff0c;都是对矩阵进行运算&#xff0c;Pytorch的基本单位是张量。torch 可以初始化全为0、全为1、符合正态分布的矩阵确定性初始化 torch.tensor()torch.arrange()torch.linspace()torch.logspace…

解决Ubuntu18.04安装好搜狗输入法后无法打出中文的问题

首先下载安装 搜狗拼音输入法 &#xff0c;下载选择&#xff1a; x86_64 在ubuntu中设置 fcitx 最后发现安装好了&#xff0c;图标有了 &#xff0c;但是使用时不能输入中文&#xff0c;使用下面的命令解决&#xff1a; sudo apt install libqt5qml5 libqt5quick5 libqt5qu…

前端菜鸟浅谈Web前端开发技术

Web前端开发技术按照过程遵循了由容易到困难&#xff0c;这就请求Web前端开发工作技术员方面要熟练学习基础的Web开发技术&#xff0c;关于网站性能的美化、SEO以及基础的关于服务器端方面的知识&#xff1b;另一方面还对开发人员有具体要求&#xff0c;比如能够熟练且灵敏的使…

回顾(第六课)

Linux特点 开源 更流畅更稳定更安全 华为的openEuler (服务器) ------------------------------------------------------------------------- 一 查询命令行操作 Linux 常用到的命令 查看当前所在位置 pwd 查看目录下或者本身的信息或者内容 ls l…

学习笔记|串口通信的基础知识|同步/异步|常见的串口软件的参数|STC32G单片机视频开发教程(冲哥)|第二十集:串口通信基础

目录 1.串口通信的基础知识串口通信(Serial Communication)同步/异步&#xff1f;全双工&#xff1f;常见的串口软件的参数 2.STC32的串口通信实现原理引脚选择模式选择 3.串口通信代码实现编写串口1通信程序测试 总结 1.串口通信的基础知识 百度百科&#xff1a;串口通信的概…

【dp】背包问题

背包问题 一、背包问题概述二、01背包问题&#xff08;1&#xff09;求这个背包至多能装多大价值的物品&#xff1f;&#xff08;2&#xff09;若背包恰好装满&#xff0c;求至多能装多大价值的物品&#xff1f; 三、完全背包问题&#xff08;1&#xff09;求这个背包至多能装多…