【算法基础】归并排序

news/2024/11/9 5:04:38/

目录

一、归并排序的思想

二、归并排序的步骤

三、归并的方式

四、代码模板


一、归并排序的思想 

归并排序和快速排序一样,都是分治的思想。它是将一个无序的数组一分为二,最后再合二为一,将两个有序数组合并成为一个有序数组。

时间复杂度:O(nlogn)是稳定的排序

 二、归并排序的步骤

确定分界点。这个分界值通常是中间值  mid = (l + r) / 2

递归排序分界点左右两部分的区间。

归并。将两个有序序列合并成一个有序序列。【重点】

 三、归并的方式

【双指针算法】

大致过程如下(后附流程图):

第一步:使用2个指针 i = l ,j = mid + 1 分别指向分界点两端的数组头。

第二步:创建临时数组tmp来暂存排完有序的数组,用k来遍历tmp。

第三步:比较a[i] 和 a[j] 直至其中一个数组中的元素全部比完。分为两种情况:若a[i] \leq a[j] , 则tmp[k++] = a [i++] (将小的元素先放入tmp),同理,a[i] > a[j],则tmp[k++] = a[j++]

第三步:左右区间可能会有多余元素,则将多余元素原封不动放入数组tmp

第四步:最后再将tmp数组中的元素复制回原数组 a[ ]

【流程图】

四、代码模板

//定义全局变量临时数组
int tmp[10000000];
void merge_sort(int a[],int l,int r)
{if (l >= r) return; //一个数或没有数,没必要排序(递归出口) //第一步:确定分界点int mid = (l + r) / 2;//第二步:递归排序分界点左右两部分的区间//递归左部分区间merge_sort(a,l,mid);//递归右部分区间merge_sort(a,mid + 1,r);//第三步:归并(双指针)int i = l,j = mid + 1;int k = 0;//遍历临时数组kmpwhile(i <= mid && j <= r){if (a[i] <= a[j]) tmp[k++] = a[i++];else tmp[k++] = a[j++];}//如果左区间还有元素while (i <= mid) tmp[k++] = a[i++];//如果右区间还有元素while(j <= r) tmp[k++] = a[j++];//最后将tmp里的元素复制到原数组a[]for(int i = l,k = 0;i <= r;i++,k++) a[i] = tmp[k];
}


http://www.ppmy.cn/news/18421.html

相关文章

2023年新年烟花代码(背景音乐完整版)

文章目录前言烟花效果展示使用教程查看源码HTML代码CSS代码JavaScript新年祝福前言 大家过年好&#xff01;新春佳节&#xff0c;在这个充满喜悦的日子里&#xff0c;愿新年的钟声带给你一份希望和期待&#xff0c;我相信&#xff0c;时空的距离不能阻隔你我&#xff0c;我的祝…

第五层:C++中的运算符重载

文章目录前情回顾运算符重载概念为什么会出现运算符重载运算符重载中函数名格式加减运算符重载作用实现左移运算符重载作用左移运算符是什么&#xff1f;实现递增递减运算符作用实现前置后置赋值运算符重载关系运算符重载作用实现函数调用运算符重载第二种重载掌握&#xff01;…

Zookeeper 【下载与安装,基本使用】

目录 1. 什么是zookeeper 2. zookeeper下载与安装 3. Zookeeper 测试 1. 什么是zookeeper zookeeper实际上是yahoo开发的&#xff0c;用于分布式中一致性处理的框架。最初其作为研发Hadoop时的副产品。 由于分布式系统中一致性处理较为困难&#xff0c;其他的分布式系统没有…

ACM模板(数学算法)

目录 〇&#xff0c;全文说明、宏定义代码 一&#xff0c;单例、快速幂、数论 二&#xff0c;并查集、DancingLink、图论 三&#xff0c;test 〇&#xff0c;全文说明、宏定义代码 所有接口分三类&#xff1a; Sieve类继承了单例模板&#xff0c;用单例对象去调用接口。并…

【阅读笔记】《重构》 第五六章

第五章 重构列表 重构的记录格式 建造一个重构词汇表一个简短概要&#xff0c;解决的问题&#xff0c;应该做的事&#xff0c;展示重构前后示例动机&#xff0c;为什么要重构做法&#xff0c;介绍如何进行此一重构范例&#xff0c;说明重构手法如何运作 寻找引用点 利用文本…

vs code中的platformIO插件,完成Arduino的程序编写,导入,安装开发板管理库

准备工作 vs code已经安装好&#xff0c;扩展插件plateformIO也安装好。&#xff08;下图是platformIO安装方式&#xff09; platformIO界面功能介绍和简单使用 新建Arduino项目 选择正确的开发板型号&#xff0c;和自己习惯的编译框架。打开后有一个.ini的配置文件&#x…

MySQL详细教程,2023年硬核学习路线

文章目录前言1. 数据库的相关概念1.1 数据1.2 数据库1.3 数据库管理系统1.4 数据库系统1.5 SQL2. MySQL数据库2.1 MySQL安装2.2 MySQL配置2.2.1 添加环境变量2.2.2 新建配置文件2.2.3 初始化MySQL2.2.4 注册MySQL服务2.2.5 启动MySQL服务2.3 MySQL登录和退出2.4 MySQL卸载2.5 M…

【DX-BT24蓝牙模块连接Arduino与手机透传教程】

【DX-BT24蓝牙模块连接Arduino与手机透传教程】1. 前言2. 接线3. 程序设计详解4. 演示效果5. 小结1. 前言 大夏龙雀科技DX-BT24&BT24-S&BT24-PA蓝牙模块,拥有5.1蓝牙协议,模块内置标准串口协议。前期设置蓝牙名称为VOR&#xff0c;采用默认波特率9600&#xff0c;详细…