c++归并排序详解

发布时间 - 2026-01-11 01:32:07    点击率:

说一说归并排序

归并排序:归并排序(英语:Merge sort,或mergesort),是创建在归并操作上的一种有效的排序算法,效率为O(n log n)。1945年由约翰·冯·诺伊曼首次提出。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用,且各层分治递归可以同时进行。

归并排序的核心思想是将两个有序的数列合并成一个大的有序的序列。通过递归,层层合并,即为归并。

 

如图,从下到上,每一步都需要将两个已经有序的子数组合并成一个大的有序数组,如下是实现合并的具体代码,请读者细细体会

 void merge(int arr[],int l,int mid,int r)
 {
   int aux[r-l+1];//开辟一个新的数组,将原数组映射进去 
   for(int m=l;m<=r;m++)
   {
     aux[m-l]=arr[m];
   }
   
   int i=l,j=mid+1;//i和j分别指向两个子数组开头部分
   
   for(int k=l;k<=r;k++)
   {
     if(i>mid)
     {
       arr[k]=aux[j-l];
       j++;
     }
     else if(j>r)
     {
       arr[k]=aux[i-l];
       i++;
     }
         else if(aux[i-l]<aux[j-l])
         {
           arr[k]=aux[i-l];
           i++;  
         }
         else
         {
           arr[k]=aux[j-l];
           j++;
         }
   } 
 } 

上图代码已经完成了归并中的“并”这一部分,归并归并,有并必有归,如下实现“归”的部分

 void merge_sort(int arr[],int l,int r)
{
  if(l >=r)
    return ;
  int mid=(l+r)/2; 
  merge_sort(arr,l,mid);
  merge_sort(arr,mid+1,r);
  merge(arr,l,mid,r);
}

由于上图中的l,r不方便使用者调用,于是我们创建一个方便自己调用的my_merge_sort函数

 void my_merge_sort(int arr[],int n)
{
  merge_sort(arr,0,n-1);  
} 

以上我们便实现了归并排序中的归和并,归并排序是利用二分法实现的排序算法,时间复杂度为nlogn,是一种比较快速的排序算法。如下是笔者自己写的归并排序的全部代码,

 #include <iostream>
 using namespace std;
 
 
 void merge(int arr[],int l,int mid,int r)
 {
   int aux[r-l+1];//开辟一个新的数组,将原数组映射进去 
   for(int m=l;m<=r;m++)
   {
     aux[m-l]=arr[m];
   }
   
   int i=l,j=mid+1;//i和j分别指向两个子数组开头部分
   
   for(int k=l;k<=r;k++)
   {
     if(i>mid)
     {
       arr[k]=aux[j-l];
       j++;
     }
     else if(j>r)
     {
       arr[k]=aux[i-l];
       i++;
     }
         else if(aux[i-l]<aux[j-l])
         {
           arr[k]=aux[i-l];
           i++;  
         }
         else
         {
           arr[k]=aux[j-l];
           j++;
         }
   } 
 } 
 //递归的使用归并排序,对arr[l....r]排序 
 void merge_sort(int arr[],int l,int r)
 {
   if(l >=r)
     return ;
   int mid=(l+r)/2; 
   merge_sort(arr,l,mid);
   merge_sort(arr,mid+1,r);
   merge(arr,l,mid,r);
 }
 
 void my_merge_sort(int arr[],int n)
 {
   merge_sort(arr,0,n-1);  
 } 
 
 int main()
 {
   int a[6];
   for(int i=0;i<6;i++)
   {
     cin>>a[i];
   }
   my_merge_sort(a,6);
   for(int i=0;i<6;i++)
   {
     cout<<a[i]<<" ";
   }
   return 0;
 } 

上面实现的归并排序是自顶向下的,我们可以以另外一种方向来实现归并,改递归为迭代。如下实现

 #include <iostream>
 #include <math.h> 
 using namespace std;
 
 void merge(int arr[],int l,int mid,int r)
 {
   int aux[r-l+1];//开辟一个新的数组,将原数组映射进去 
   for(int m=l;m<=r;m++)
   {
     aux[m-l]=arr[m];
   }
   
   int i=l,j=mid+1;//i和j分别指向两个子数组开头部分
   
   for(int k=l;k<=r;k++)
   {
     if(i>mid)
     {
       arr[k]=aux[j-l];
       j++;
     }
     else if(j>r)
     {
       arr[k]=aux[i-l];
       i++;
     }
         else if(aux[i-l]<aux[j-l])
         {
           arr[k]=aux[i-l];
           i++;  
         }
         else
         {
           arr[k]=aux[j-l];
           j++;
         }
   } 
 }
 
 void mergesort(int arr[],int n)
 {
   for(int sz=1;sz<=n;sz+=sz)
   {
     for(int i=0;i+sz<n;i+=sz+sz)//i+sz防止越界 
     {//对arr[i...sz-1]和arr[i+sz.....i+2*sz-1]进行排序 
       merge(arr,i,i+sz-1,min(i+sz+sz-1,n-1));  //min函数防止越界 
     } 
   } 
   
 } 
 
 int main()
 {
   int a[5];
   for(int i=0;i<5;i++)
   {
     cin>>a[i];
   }
   mergesort(a,5);
   for(int i=0;i<5;i++)
   {
     cout<<a[i]<<" ";
   }
   return 0;  
 } 


# c语言归并排序  # 归并排序的C++实现  # C++归并排序  # C++归并排序算法实例  # C++实现的归并排序算法详解  # C++实现归并排序(MergeSort)  # C++实现自底向上的归并排序算法  # C++实现自顶向下的归并排序算法  # c++实现二路归并排序的示例代码  # C++实现归并排序算法  # 超详细解析C++实现归并排序算法  # C++实现归并排序  # C++归并排序代码实现示例代码  # 递归  # 将原  # 约翰  # 这一  # 是一种  # 我们可以  # 英语  # 如图  # 必有  # 即为  # 创建一个  # 图中  # 上图  # 说一说  # 实现了  # 完成了  # 治法  # 迭代  # 首次提出  # 从下到上 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 网页制作模板网站推荐,网页设计海报之类的素材哪里好?  动图在线制作网站有哪些,滑动动图图集怎么做?  Laravel Debugbar怎么安装_Laravel调试工具栏配置指南  如何选择PHP开源工具快速搭建网站?  如何在Tomcat中配置并部署网站项目?  Win11怎么关闭资讯和兴趣_Windows11任务栏设置隐藏小组件  家族网站制作贴纸教程视频,用豆子做粘帖画怎么制作?  如何登录建站主机?访问步骤全解析  Bootstrap整体框架之CSS12栅格系统  网站建设要注意的标准 促进网站用户好感度!  Python高阶函数应用_函数作为参数说明【指导】  Laravel怎么创建控制器Controller_Laravel路由绑定与控制器逻辑编写【指南】  JavaScript如何实现继承_有哪些常用方法  韩国代理服务器如何选?解析IP设置技巧与跨境访问优化指南  香港服务器网站卡顿?如何解决网络延迟与负载问题?  阿里云网站搭建费用解析:服务器价格与建站成本优化指南  javascript读取文本节点方法小结  Laravel如何集成第三方登录_Laravel Socialite实现微信QQ微博登录  EditPlus中的正则表达式 实战(4)  php做exe能调用系统命令吗_执行cmd指令实现方式【详解】  如何有效防御Web建站篡改攻击?  手机怎么制作网站教程步骤,手机怎么做自己的网页链接?  成都网站制作公司哪家好,四川省职工服务网是做什么用?  手机钓鱼网站怎么制作视频,怎样拦截钓鱼网站。怎么办?  如何在HTML表单中获取用户输入并结合JavaScript动态控制复利计算循环  微信小程序 五星评分(包括半颗星评分)实例代码  简单实现Android验证码  Laravel如何生成API文档?(Swagger/OpenAPI教程)  Laravel如何使用查询构建器?(Query Builder高级用法)  如何基于PHP生成高效IDC网络公司建站源码?  laravel怎么使用数据库工厂(Factory)生成带有关联模型的数据_laravel Factory生成关联数据方法  小米17系列还有一款新机?主打6.9英寸大直屏和旗舰级影像  悟空浏览器如何设置小说背景色_悟空浏览器背景色设置【方法】  Laravel怎么解决跨域问题_Laravel配置CORS跨域访问  Laravel怎么处理异常_Laravel自定义异常处理与错误页面教程  手机软键盘弹出时影响布局的解决方法  怎样使用JSON进行数据交换_它有什么限制  Laravel定时任务怎么设置_Laravel Crontab调度器配置  如何用狗爹虚拟主机快速搭建网站?  Midjourney怎样加参数调细节_Midjourney参数调整技巧【指南】  mc皮肤壁纸制作器,苹果平板怎么设置自己想要的壁纸我的世界?  HTML5空格和margin有啥区别_空格与外边距的使用场景【说明】  Laravel如何实现密码重置功能_Laravel密码找回与重置流程  新三国志曹操传主线渭水交兵攻略  网站制作大概多少钱一个,做一个平台网站大概多少钱?  如何快速生成ASP一键建站模板并优化安全性?  Laravel的HTTP客户端怎么用_Laravel HTTP Client发起API请求教程  Android仿QQ列表左滑删除操作  Laravel如何获取当前用户信息_Laravel Auth门面获取用户ID  Laravel如何使用Socialite实现第三方登录?(微信/GitHub示例)