【模板】归并排序

【基础算法】归并排序(Merge sort)图文详解,附模板 归并排序采用“分治”思想,在一组待排序的数字中,从中间将数组断成两段,进行递归处理,处理完成后左右两段已经是有序的了,再将左右两段进行合并。即“先分后合”,将原问题分割为子问题,逐个解决后再合并,得到原问题的结果。 阅读详情

归并排序基本思想

二分法、分治法、递归思想。

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

归并排序基本流程

说法1.按照二分思想,先将序列分成两个大小大致相同的2个子集合,分别对2个子集合进行排序(段内有序),最终将排好序的子集合合并成为所要求的排好序的集合(段间有序)。

说法2.从整体来看,假设初始序列有n个元素,实际是将它看成n个有序的子序列(长度是1),然后两两归并,直到得到长度是n的有序子序列。

时间复杂度分析:平均时间复杂度得出是o(nlogn),是渐近意义下的最优排序算法。原因:考虑两两归并的过程,每一层进行n次比较,归并树的高度是log_2n,因此得解。

空间复杂度分析:

在合并有序数组时需要额外的辅助空间,递归也要调用栈的空间,整体复杂度o(n)。

稳定性分析:是稳定的排序(相同元素相对位置不变)。

如图是代码所示的2路-归并排序(同理可以有3路、4路)。

图片来源

代码注意点

1.写递归程序要注意写结束条件(if(low>=high))。

2.合并时必须申请新的存储空间,不可以在原始数组上操作。

3.for循环后还可能有没有合并的元素,需要while循环直接合并剩下的元素。

//归并排序
#include<iostream>
#include<cstring>
#include<cstdlib>
using namespace std;
void merge(int a[],int low,int mid,int high)
 //合并a[low...mid]和a[mid+1...high] (有序) 
 {
 	int *tmp = new int[high-low+1];	//动态分配临时空间 
 	int i,j,k;//临时变量 
	 for(i=low,j=mid+1,k=0;i<=mid && j<=high;k++)
	 //注意循环条件,当有一边的元素合并完成后即不满足循环条件 
	 {
	 	if(a[i]<a[j])
	 	{
	 		tmp[k]=a[i];
	 		i++;
		 }
		 else{
		 	tmp[k]=a[j];
		 	j++;
		 }
	 }
	 while(i<=mid)//归并可能存在的剩余元素(左) 
	 {
	 	tmp[k]=a[i];
	 	k++;i++;
	  } 
	  while(j<=high)//归并可能存在的剩余元素(右) 
	  {
	  	tmp[k]=a[j];
	  	k++;j++;
	  }
 	for(int i=0;i<k;i++)
 	{
 		a[low+i]=tmp[i]; 
		 //把临时数组的元素存回原始数组
	 }
	 delete []tmp;//释放临时空间 
  } 
void mergeSort(int a[],int low,int high)
{
	if(low>=high) return; //当只有一个元素时返回 
	if(low<high)
	{
		int mid = (low+high)/2;
		mergeSort(a,low,mid);	//二分法 
		mergeSort(a,mid+1,high);	//递归调用 
		merge(a,low,mid,high);//合并有序序列 
	}
 } 
  int main(void)
{
	int n = 10;
	int arr[10] = {0};
	for(int i=0;i<n;i++)
	{
		arr[i]=rand()%100;
	}
	for(int i=0;i<n;i++)
	{
		cout<<arr[i]<<" ";
	}
	cout<<endl; 
	mergeSort(arr,0,n-1);
	for(int i=0;i<n;i++)
	{
		cout<<arr[i]<<" ";
	}
	return 0;
}

 

C++模板归并排序 C++模板实现归并排序 阅读详情

相关推荐

[附源码]计算机毕业设计JAVA网上花店系统

附源码]计算机毕业设计JAVA网上花店系统项目运行环境配置:(Webstorm也行)+ Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。项目技术:等等组成,B/S模式 + Maven管理等等。环境需要1.运行环境:最好是java jdk 1.8,我们在这个平台上运行的。其他版本理论上也可以。2.IDE环境:IDEA,Eclipse,Myeclipse都可以。推荐IDEA;3.tomcat。

ssm毕设程序设计 2445

归并排序(手写)

题目: 给定你一个长度为 n 的整数数列。 请你使用归并排序对这个数列按照从小到大进行排序。 并将排好序的数列按顺序输出。 输入格式: 输入共两行,第一行包含整数 n。 第二行包含 n 个整数(所有整数均在 1∼109 范围内),表示整个数列。 输出格式: 输出共一行,包含 n 个整数,表示排好序的数列。 数据范围 1 ≤ n≤ 100000 输入样例: 5 3 1 2 4 5 输出样例: 1 2 3 4 5 #include<bits/stdc++.h> using namespace std

loi_王振东 749

骗分导论 CSP、NOIP、蓝桥杯、PAT、USACO等竞赛的算法骗分技巧 轻松省三

问题来了,那么多座桥,炸一座就破坏岛屿的联系,可能性微乎其微(除非特别设计数据)。它们的价值极大,不仅能初步帮你检验程序的对错,而且,如果你不会做这道题,你就可以直接输出样例!在OI考试中最后难的题数据最后的几个,他们往往不会创造新的数据,此时就可以直接输出最后几个数据了。需要运用《骗分导论》第3章中学到的知识,先写出朴素算法,然后造一些数据,可能就会发现规律。有些时候,问题的答案可能很有特点:对于大多数情况,答案是一样的。据说,在NOIP2013中,有人最后一题不会,愤然打了个随机数,结果得了。

星卯教育-信奥教练tony 6407

【归并排序模板】

归并排序(Merge Sort)是一种基于分治思想的排序算法,它将待排序序列分成两个子序列,分别对子序列进行排序,然后将两个有序的子序列合并成一个有序的序列。将待排序序列分成两个子序列,直到每个子序列只有一个元素。对每个子序列进行排序,可以使用递归调用归并排序。将两个有序的子序列合并成一个有序的序列,得到最终的排序结果。归并排序的时间复杂度为O(nlogn),其中n是待排序序列的长度。归并排序是一种稳定的排序算法,它的空间复杂度为O(n),需要额外的空间来存储临时的子序列。

学习愚公的博客 234

CentOS 7下rsyslog日志服务器搭建全攻略:从安装到避坑

本文详细介绍了在CentOS 7系统上搭建rsyslog日志服务器的完整流程,从基础安装到高级配置,包括协议设置、日志模板设计、安全加固和性能优化。特别分享了生产环境中的实战技巧和常见问题解决方案,帮助用户高效构建可靠的日志管理系统。

happy2的博客 688

littlefs系列:wear leveling

wear leveling的功能是通过block alloctor实现的。littlefs通过两个方法实现磨损均衡: 1) 检测和恢复bad blocks 2)通过dynamic blocks均衡磨损 检测和恢复bad blocks和block alloctor的关系并不紧密,主要依靠文件系统本身来检测坏块并标记。在littlefs中,检测坏块主要是通过写后回读并比较的方式实现的,如果数据不一致则说明是一个坏块。一旦检测到了坏块就要进行恢复。 如果是写入错误,因为数据才RAM中还有备份,因此需.

nstcl的博客 2570

一文读懂『归并排序』算法(Merge Sort)(含算法模板)

一文读懂『归并排序』算法(Merge Sort)(含算法模板)

qq_40430360的博客 4800

深入了解AES_GCM算法

常见的对称加密算法,在解密过程中无法确认密钥是否正确的。这就意味着,密文可以用任何密钥执行解密运算,得到一组疑似密文;由于不知道密钥是否正确,故也不能确定解密出来的明文数据是否正确。因此,需要在对称加密算法上增加一层验证机制,常见思路为使用加密算法进行加密保证机密性,使用摘要算法计算MAC保证完整性和真实性,这就涉及到摘要计算和加密计算的前后顺序和参与计算的数据、密钥等,使用起来略微麻烦。

huaqianzkh的专栏 4194

[排序] 快速排序、归并排序模板(模板)

文章目录0. 前言1. 快速排序2. 归并排序 0. 前言 正经人谁手写这玩意? 1. 快速排序 785. 快速排序 本质: 分治。是不稳定的排序算法。 时间复杂度:O(nlogn)O(nlogn)O(nlogn) 空间复杂度:O(logn)O(logn)O(logn),基于递归,用到栈空间 模板注意点: 注意点就是不要随便改动里面的任何一个下标… 快排边界情况很多很多,这是个经过千锤百炼的模板代码,理解算法思想后背过模板就行了 基准值 int x = q[l+r>>1],写成 int x

Y-puyu 的博客 612

Fluent动网格实战:5种区域运动类型详解与配置避坑指南

本文详细解析了Fluent动网格技术中的五种区域运动类型,包括固定、刚体、变形、用户自定义和系统耦合,并提供了配置技巧与避坑指南。通过实际案例和参数优化建议,帮助工程师有效解决网格变形、计算稳定性等常见问题,提升CFD仿真效率。

weixin_28339967的博客 415

【ROS机器人系统】实验4 ROS简单应用:激光SLAM与导航

ROS简单应用:激光SLAM与导航 (1)了解机器人和SLAM之间关系 (2)了解激光SLAM (3)了解gmapping和导航

南京大学软件工程硕士在读 2146

归并排序及模板

文章目录归并排序理解归并排序模板 归并排序理解 归并排序的主要操作如下: (1)分解。把初始序列分成长度相同的左、右两个子序列,然后把每个子序列再分成更小的两个子序列,直到子序列只包含一个数。这个过程用递归实现。 (2)求解子问题,对子序列排序。最底层的子序列只包含一个数,其实不用排序。 (3)合并。归并两个有序的子序列,这是归并排序的主要操作。比如下面举例,把a[ ]分成两个子序列,比较后存进b...

ker的博客 2050

西门子 S7-1200 G2 高速计数器的使用方法介绍

西门子 S7-1200 G2 高速计数器的使用方法介绍

Robot_PLC_HMI_Automation 1702

归并排序模板以及求解逆序对模板

归并排序: #include<iostream> using namespace std; int num[1005]; //输入数组&答案数组 int temp[1005]; //中转数组 void merge(int l,int r,int mid) { int i=l,j=mid,p=l; while(i<mid&&j<r)//左右两边打擂 { if(num[i]<num[j])//左边输了(左边比较小) temp[p++]

GETOVERMIND的博客 277

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

归并排序模板

归并排序模板 public static void merger(int[] nums,int left,int right,int mid) { int[] tmp=new int[right-left+1]; int i=left; int j=mid+1; int tmpi=0; while(i<=mid&&j<=right) { if(nums[i]<=nums[j]) { tmp[tmpi++]=nums[i++]; }else {

qq_44837971的博客 169

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

c++ 归并排序 - 模板函数写法

归并排序 - 模板函数写法 // merge_sort.cpp #include <iostream> #include <vector> #include "../head_file/template_head.h" using namespace std; void merge_sort() { cout << "Merge Sort!!!" << endl; vector<int> list = { 8,9,1,7,2,3,5,4,6

犹有傲霜枝的博客 785

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

归并排序算法模板

归并排序算法模板归并排序算法模板 归并排序算法模板 void merge_sort(int q[], int l, int r) { if (l >= r) return; int mid = l + r >> 1; merge_sort(q, l, mid); merge_sort(q, mid + 1, r); int k = 0, i = l, j = mid + 1; while (i <= mid &&.

佛系更新 844

归并排序【图解及模板】

归并排序的实现,附上图解帮助理解

_featherbrain的博客 282

归并排序实现思想及代码模板

归并排序思想: ①划分:将进入方法的数组划分为两部分 ②递归:递归继续划分,直到个数为1 ③合并:根据值的大小来合并,小的先放入合并的数组当中。 例如:1, 1, 7, 3, 4, 5, 9, 8, 3 一直递归到底层 划分为{ 1 , 1 } { 7 } { 3 , 4 } { 5 , 9 } { 8 , 3 } 合并{ 1 , 1 , 7 } { 3 , 4 } { 3 , 5 , 8 , 9} 合并{ 1 , 1 , 3 , 4 , 7 } { 3 , 5 , 8 ,...

一条咸鱼的博客 3134

Java归并排序模板

归并排序模板,简洁、好记

weixin_43954951的博客 318

C++归并排序模板

#include using namespace std; template void Merge( T* arr, int low, int mid, int high ) { int i, j, k; i = low; j = mid + 1; k = 0; T* tmp = new T[high - low + 1]; while( i

恨天低 4989

算法模板:归并排序【沈七】

一文带你 深入了解归并排序的原理!

只想和你一起进步 2995
上一篇: 【模板】选择排序
下一篇: 【模板】堆排序
coderwait
博客等级 码龄9年 20粉丝 210原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值