合并排序是成功应用分治技术的一个完美例子。对于一个需要排序的数组A[1...n],合并排序把它一分为二:A[1...[n/2]]和A[[n/2+1]...n],并对每个子数组,进行递归排序,然后把这两个排好序的子数组合并成一个有序数组。

void MergeSort(int left,int right)
{if(left<right){int middle=left+(right-left)/2;MergeSort(left,middle);MergeSort(middle+1,right);Merge(left,right,middle);//将两个已经排好序的子数组,合并成一个有序数组}
}

那这个已经排好序的子数组,如何合并成一个有序数组呢?请看代码演示:

int a[1005];//储存初始值的数组
int b[1005];//自己定义的辅助数组
//合并两个有序子序列
void Merge(int left,int right,int middle)
{int i=left,j=middle+1,k=left;while(i<=middle&&j<=right){if(a[i]<=a[j]) b[k++]=a[i++];//先把a[i]赋值给b[k],再执行k++和i++else b[k++]=a[j++];}while(i<=middle) b[k++]=a[i++];while(j<=right) b[k++]=a[j++];for(int i=left;i<=right;i++) a[i]=b[i];
}

现在博主来口头阐述一下,这个函数是如何实现将两个排好序的数组合并为一个新的有序数组的,我们首先确定了待排序的数组范围是从下标为left到下标为right的部分,而两个子数组的范围是那些呢?一个数组的范围是从下标为left到middle的部分,另一个数组的范围是从下标为middle+1到right的部分,现在从这两个数组的第一个数字开始比较,将较小的数赋值给b[k],然后k++,为了存储下一个数据,那个较小的数所在的子数组的下标便会往后移动一位,再继续两两比较,等到其中一个子数组遍历完,便退出循环,在比较的时候,最后可能会有一个子数组剩余,此时便要把剩余的部分添加到辅助数组的末尾,最后再把辅助数组遍历一遍,去更新a数组,这样一来,a数组从下标为left到下标为right的部分就变成升序排列了,降序排列同理可得,博主便不在过多的阐述。

 图形过程演示

如果想要彻底看懂这个过程是如何进行的,博主认为还需要对递归有一定的了解,了解递归的过程是如何进行的,先后次序是怎么样的,这里博主曾经写过小偷的背包和递归的讲解一文,里面一步一步演示了递归的进行,供大家学习!

代码演示

#include<iostream>
#include<algorithm>
using namespace std;
int a[1005];//储存初始值的数组
int b[1005];//自己定义的辅助数组
//合并两个有序子序列
void Merge(int left,int right,int middle)
{int i=left,j=middle+1,k=left;while(i<=middle&&j<=right){if(a[i]<=a[j]) b[k++]=a[i++];//先把a[i]赋值给b[k],再执行k++和i++else b[k++]=a[j++];}while(i<=middle) b[k++]=a[i++];while(j<=right) b[k++]=a[j++];for(int i=left;i<=right;i++) a[i]=b[i];
}
void MergeSort(int left,int right)
{if(left<right){int middle=left+(right-left)/2;MergeSort(left,middle);MergeSort(middle+1,right);Merge(left,right,middle);}
}
int main()
{int n;cin>>n;for(int i=1;i<=n;i++) cin>>a[i];MergeSort(1,n);for(int i=1;i<=n;i++) cout<<a[i]<<" ";return 0;
}

运行图片中的样例

博主很久更新博客了,也有点忙,写的比较仓促,如果有疑问,欢迎评论区留言!!!

最近在抖音里面看到一句话,非常有感触,送给大家,也警醒自己,与之共勉!!!

舞台再大,你不上台,永远是一个观众。平台再好,你不参与,永远是局外人。能力再大,你不行动,只能看别人成功!没有人会关心你付出过多少努力,撑的累不累,撑的痛不痛,他们只会看你最后站在什么位置,然后羡慕或鄙夷。

合并排序算法(详解)相关推荐

  1. 7大排序算法详解+java实现

    目录 0 概述 1 冒泡排序 2 选择排序 3 插入排序 4 希尔排序 5 快速排序 6 归并排序 7 基数排序 下载地址 7大排序算法详解文档及java代码实现(可直接运行)下载地址:https:/ ...

  2. 排序算法,最全的10大排序算法详解(Sort Algorithm)

    文章目录 排序算法,最全的10大排序算法详解(Sort Algorithm) 排序算法分类 排序算法稳定性 时间复杂度(time complexity) 1#时间复杂度的意义 2#基本操作执行次数 如 ...

  3. 十大经典排序算法详解(三)-堆排序,计数排序,桶排序,基数排序

    养成习惯,先赞后看!!! 你的点赞与关注真的对我非常有帮助.如果可以的话,动动手指,一键三连吧!!! 十大经典排序算法-堆排序,计数排序,桶排序,基数排序 前言 这是十大经典排序算法详解的最后一篇了. ...

  4. 基础排序算法详解与优化

    文章图片存储在GitHub,网速不佳的朋友,请看<基础排序算法详解与优化> 或者 来我的技术小站 godbmw.com 1. 谈谈基础排序 常见的基础排序有选择排序.冒泡排序和插入排序.众 ...

  5. js排序算法详解-归并排序

    js系列教程5-数据结构和算法全解 js排序算法详解-归并排序 归并排序其实可以类比二分法,二分法其实就是二等分的意思,简而言之就是不断和新序列的中间值进行比较.归并排序似乎有异曲同工之妙,什么意思呢 ...

  6. js排序算法详解-基数排序

    全栈工程师开发手册 (作者:栾鹏) js系列教程5-数据结构和算法全解 js排序算法详解-基数排序 其实基数排序和桶排序挺类似的,都是找一个容器把属于同一类的元素装起来,然后进行排序.可以把基数排序类 ...

  7. js排序算法详解-桶排序

    全栈工程师开发手册 (作者:栾鹏) js系列教程5-数据结构和算法全解 js排序算法详解-桶排序 一看到这个名字就会觉得奇特,几个意思,我排序还要再准备几个桶不成?还真别说,想用桶排序还得真准备几个桶 ...

  8. js排序算法详解-计数排序

    全栈工程师开发手册 (作者:栾鹏) js系列教程5-数据结构和算法全解 js排序算法详解-计数排序 计数排序就是遍历数组记录数组下的元素出现过多次,然后把这个元素找个位置先安置下来,简单点说就是以原数 ...

  9. js排序算法详解-堆排序

    全栈工程师开发手册 (作者:栾鹏) js系列教程5-数据结构和算法全解 js排序算法详解-堆排序 这种排序方式呢,理论性太强,看动图的时候满脸写着懵逼,多看几遍似乎明白了编者的意图,但是要把这种理论的 ...

最新文章

  1. C++宏assert()
  2. Datawhale实验室
  3. python3 urllib
  4. windows dlib 安装测试
  5. Kafka Without ZooKeeper ---- 不使用zookeeper的kafka集群
  6. android sdk64位资源,android SDK 有32位或64位的分别吗
  7. MacOS下载钉钉直播回放经验总结
  8. Chrome您的连接不是私密连接,解决办法
  9. scala.的Enumeration枚举示例(转)
  10. hdu 1452 因子和 + 逆元素+ 快速幂
  11. Activemq 下载地址
  12. elementui分页插件使用总结
  13. 云空间插html音乐,【详细教程】如何在空间中引用网易云音乐
  14. 【物理应用】大气辐射和透射率模型及太阳和月亮模型(Matlab代码实现)
  15. 移动 PC 的数据加密工具包 - 安全分析
  16. 5G应用创新发展策略研究
  17. c++ 转换函数 convert function
  18. 白话空间统计二十一:密度分析(七) Python实现
  19. MyBatisPlus快速入门
  20. 【渝粤教育】广东开放大学 现代企业管理 形成性考核 (51)

热门文章

  1. 【插件工具】Vue.js is detected on this page. Open DevTools and look for the Vue panel报错及安装vue-detools
  2. Android常用命令行指令
  3. WebBuilder后台JSON处理
  4. Unix/Linux编程:dlopen API函数
  5. abas ERP – ERP行业中的“隐藏冠军”
  6. C++ 单引号和双引号的区别
  7. The browser supports WebGL, but initialization failed
  8. 头歌教学实践平台(高级程序语言设计(c))
  9. PHP微信小程序之获取并解密用户数据获取openId和unionId
  10. 如何从Mac轻松清理其他存储文件?