【手撕排序3】归并排序

在这里插入图片描述
🍃 本系列包括常见的各种排序算法,如果感兴趣,欢迎订阅🚩
🎊个人主页:小编的个人主页
🎀 🎉欢迎大家点赞👍收藏⭐文章
✌️ 🤞 🤟 🤘 🤙 👈 👉 👆 🖕 👇 ☝️ 👍

目录

  • 🐼前言
  • 🐼归并排序
  • 🐼文末

🐼前言

🌟在上一节我们实现了快速排序,感受到了快速排序的魅力,如果感兴趣的小伙伴,可以阅读我的上一篇文章:> 快速排序,这节小编将带领大家感受归并排序的美学。

🐼归并排序

🔍归并排序采用分治的思想,将一组乱序的数字先二分,再二分,直到不能二分,此时每个子序列有序。再使子序列段间有序直到得到一个完全有序的子序列。再将得到的子序列合并成一个有序表。
如图:
在这里插入图片描述
🔍我们先取中间值mid二分,划分左右两个序列([left,mid],[mid+1,right])直到划分为一个元素,那么该元素就是有序的。
🔍在进行合并,将划分的两个有序数组进行合并。
总结来说,递归进行分解,回溯进行合并
归并排序代码:

void _MergeSort(int* arr,int left,int right,int* tmp)
{if (left >= right){return;}//二分int mid = left + (right - left) / 2;//根据Mid划分为两个序列 [left,mid] [mid+1,right]_MergeSort(arr, left, mid,tmp);_MergeSort(arr, mid + 1, right,tmp);//合并两个有序数组[left,mid] [mid+1,right]int begin1 = left, end1 = mid;int begin2 = mid + 1, end2 = right;int index = begin1;//从begin1开始while (begin1 <= end1 && begin2 <= end2){if (arr[begin1] < arr[begin2]){tmp[index++] = arr[begin1++];}else{tmp[index++] = arr[begin2++];}}//[left,mid]还有元素while (begin1 <= end1){tmp[index++] = arr[begin1++];}//[mid + 1, right]还有元素while (begin2 <= end2){tmp[index++] = arr[begin2++];}//将新数组拷贝到原数组for (int i = left; i <= right; i++){arr[i] = tmp[i];}
}
//归并排序
void MergeSort(int* arr, int n)
{int* tmp = (int*)malloc(sizeof(int) * n);_MergeSort(arr, 0, n - 1,tmp);free(tmp);tmp = NULL;
}

🔍为了不在原来的数组上进行合并,我们创建了一个临时数组来保存合并好的有序序列,最后,将新数组拷贝到原数组。
归并排序性能分析:

递归深度为O(logn),合并两个有序序列为O(N),所以,归并排序的时间复杂度为O(n*logn).空间复杂度为O(N);

🍀测试结果:
排序数组:{ 4,6,7,2,1,8,9,5,3 ,0 }在这里插入图片描述

🐼文末

感谢你看到这里,如果觉得本篇文章对你有帮助,点个赞👍 吧,你的点赞就是我更新的最大动力 ⛅️🌈 ☀️

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

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

相关文章

Vue中使用Antd中a-table实现表格数据列合并展示

原数据 根据需求实现当前两列数据中有相同数据时,合并列单元格 实现 源码 数据 const dataSource = ref([{id: 1,pl: "冰箱",zznd: "P1",sm: "说明说明说明1",dw: "台",gs: "1",dj: "100"},{id: 1,pl: "冰…

数据结构-数组(稀疏矩阵转置)和广义表

目录 1、数组定义 1&#xff09;数组存储地址计算示例①行优先②列优先 2&#xff09;稀疏矩阵的转置三元组顺序表结构定义 ①普通矩阵转置②三元组顺序表转置稀疏矩阵③稀疏矩阵的快速转置 3&#xff09;十字链表结构定义 2、广义表定义 1&#xff09;基本操作①GetHead②GetT…

【Spring】Spring Web MVC基础入门~(含大量例子)

阿华代码&#xff0c;不是逆风&#xff0c;就是我疯 你们的点赞收藏是我前进最大的动力&#xff01;&#xff01; 希望本文内容能够帮助到你&#xff01;&#xff01; 目录 一&#xff1a;什么是Spring Web MVC 1&#xff1a;Servlet 2&#xff1a;总结 二&#xff1a;MVC …

有向图的完全可达性(有向图搜索全路径的问题) C#DFs

在考察输入输出方面我觉得是道难题了 第一次遇见邻接表的数据结构该怎么声明 卡码网105 在力扣没找见完全相同的题 感觉需要多练习多复习这种类型的题 105. 有向图的完全可达性 题目描述 给定一个有向图&#xff0c;包含 N 个节点&#xff0c;节点编号分别为 1&…

登陆页面渗透测试常见的20种思路与总结

【渗透测试】16个实用谷歌浏览器插件分享 飞雪网络安全人才培养计划&#xff0c;绝对零区&#xff0c;公益教学&#xff01; 思路总结 1、之前是否已经留过后门&#xff0c;是&#xff0c;直接getshell&#xff0c;否&#xff0c;进行测试 2、SQL注入&万能密码&#xf…

qt QWebSocketServer详解

1、概述 QWebSocketServer 是 Qt 框架中用于处理 WebSocket 服务器端的类。它允许开发者创建 WebSocket 服务器&#xff0c;接受客户端的连接&#xff0c;并与之进行双向通信。WebSocket 是一种在单个 TCP 连接上进行全双工通讯的协议&#xff0c;它使得客户端和服务器之间的数…

掌握分布式系统的38个核心概念

天天说分布式分布式&#xff0c;那么我们是否知道什么是分布式&#xff0c;分布式会遇到什么问题&#xff0c;有哪些理论支撑&#xff0c;有哪些经典的应对方案&#xff0c;业界是如何设计并保证分布式系统的高可用呢&#xff1f; 1. 架构设计 这一节将从一些经典的开源系统架…

中小跨境卖家如何选择物流?

跨境物流作为电商交易的核心环节&#xff0c;其复杂性和多变性对卖家来说不言而喻。本文将为您详细解析跨境物流的七大流程、常见物流测评以及推荐的工具&#xff0c;帮助您在激烈的市场竞争中把握物流优势&#xff0c;提升业务效率和客户满意度。 跨境物流七大流程 1. 启运国出…

6大国有银行软开的薪资待遇清单

牛客上刷到一条关于计算机专业值得去的银行软开清单,其中对 6 大国有银行软开的薪资待遇分析我觉得很有必要同步给大家看一看。 截图信息来自牛客的漫长白日梦 其中邮储软开是最值得推荐的(offer 投票没输过),二线城市转正后第一个完整年的收入在 30 万左右,一线城市更高…

我们来学mysql -- EXPLAIN之ID(原理篇)

EXPLAIN之ID 题记ID 题记 2024美国大选已定&#xff0c;川普剑登上铁王座&#xff0c;在此过程中出谋划策的幕僚很重要&#xff0c;是他们决定了最终的执行计划在《查询成本之索引选择》中提到&#xff0c;explain的输出&#xff0c;就是优化器&#xff08;幕僚&#xff09;选…

蓝桥杯-网络安全比赛题目-遗漏的压缩包

小蓝同学给你发来了他自己开发的网站链接&#xff0c; 他说他故意留下了一个压缩包文件&#xff0c;里面有网站的源代码&#xff0c; 他想考验一下你的网络安全技能。 &#xff08;点击“下发赛题”后&#xff0c;你将得到一个http链接。如果该链接自动跳转到https&#xff0c;…

新疆高校大数据实验室案例分享

高校大数据实验室建设&#xff0c;企业可以提供技术支持、实训平台和项目案例&#xff0c;高校则提供科研和教学资源&#xff0c;实现产学研一体化。不仅有利于大数据技术的应用和人才培养也有利于区域发展。 泰迪与新疆合作的院校包括新疆大学、昌吉学院等 新疆大…

关于Flutter空安全升级方案整理

前言 Flutter 从 2.0 版本开始支持空安全&#xff08;Null Safety&#xff09;。dart 版本为&#xff1a; environment:sdk: ">2.12.0 < 3.0.0"升级到空安全后&#xff0c;由于语法的变动&#xff0c;基本上整个工程&#xff0c;代码都爆红&#xff0c;这对项…

干货 | 2024年数据要素白皮书(免费下载)

导读&#xff1a;白皮书在对比分析国际数据领域发展现状的基础上&#xff0c;围绕数据要素市场化配置改革这一主线&#xff0c;从数据高质量供给、数据创新应用、体制机制建设、产业探索方向四大方面展现了数据要素发展过程中&#xff0c;各类主体的新作为、新成效&#xff0c;…

RTT 内核基础学习

RT-Thread 内核介绍 内核是操作系统的核心&#xff0c;负责管理系统的线程、线程间通信、系统时钟、中断以及内存等。 内核位于硬件层之上&#xff0c;内核部分包括内核库、实时内核实现。 内核库是为了保证内核能够独立运行的一套小型的类似C库的函数实现子集。 这部分根据编…

六通道CAN集线器(协议型)

一、功能概述 SG_CanHub_600 是一款具有六路通道的工业级智能 CAN 数字隔离中继集线器。 SG_CanHub_600 能够实现信号再生、延长通信距离、提高总线负载能力、匹配不同速 率 CAN 网络&#xff0c;同时强大的 ID过滤功能可以极大降低 CAN 总线负荷&#xff0c;并具有故障指…

Web应用性能测试工具 - httpstat

在数字化时代&#xff0c;网站的性能直接影响用户体验和业务成功。你是否曾经在浏览网页时&#xff0c;遇到加载缓慢的困扰&#xff1f;在这个快速变化的互联网环境中&#xff0c;如何快速诊断和优化Web应用的性能呢&#xff1f;今天&#xff0c;我们将探讨一个强大的工具——h…

【Linux】从零开始使用多路转接IO --- 理解EPOLL的 LT水平触发模式 与 ET边缘触发模式

当你偶尔发现语言变得无力时&#xff0c; 不妨安静下来&#xff0c; 让沉默替你发声。 --- 里则林 --- 从零开始认识多路转接 1 EPOLL优缺点2 EPOLL工作模式 1 EPOLL优缺点 poll 的优点(和 select 的缺点对应) 接口使用方便&#xff1a;虽然拆分成了三个函数&#xff0c;…

kafka+zookeeper的搭建

kafka从2.8版本开始&#xff0c;就可以不用配置zookeeper了&#xff0c;但是也可以继续配置。我目前使用的kafka版本是kafka_2.12-3.0.0.tgz&#xff0c;其中前面的2.12表示是使用该版本的scala语言进行编写的&#xff0c;而后面的3.00才是kafka当前的版本。 通过百度网盘分享…

基础数据结构——队列(链表实现)

队列的性质 先进先出&#xff08;FIFO - First In First Out&#xff09;&#xff1a;最先加入队列的元素最先被移出后进后出&#xff08;后来的元素排在队尾&#xff09;只允许在队尾插入元素&#xff0c;在队首删除元素具有先来先服务的特点 链表实现队列 和之前创建链表相…