归并排序的核心:有序子列的归并

两个有序子列,三个指针
A子列,指针Aptr指向首地址

1 13 24 26

B子列,指针Bptr指向首地址

2 15 27 38

Tmp数组,指针Cptr首地址

比较*Aptr*Bptr的大小,小的放入Tmp数组,然后指针后移,大概的思路如此。
Tmp数组如下变化

1
1 2
1 2 13
1 2 13 15
1 2 13 15 24
1 2 13 15 24 26
1 2 13 15 24 26 27
1 2 13 15 24 26 27 28

整体代码如下

  1. 递归生成有序子数组:Msort函数
  2. 归并两个有序子列:Merge函数
  3. 统一接口:Merge_sort函数
#include<iostream>
#include<string>
#include<ctime>
#include<cstdlib>
using namespace std;//归并有序子列
/* A元素数组TmpA 临时数组L 左边数组起始位置R右边数组起始位置RightEnd 数组右端点
*/
void Merge(int A[],int TmpA[],int L,int R,int RightEnd){int LeftEnd=R-1;int Tmp=L;//存放结果的数组的起始位置int NumElement=RightEnd-L+1;while(L<=LeftEnd&&R<=RightEnd){if(A[L]<=A[R]) TmpA[Tmp++]=A[L++];else TmpA[Tmp++]=A[R++];} while(L<=LeftEnd)//直接复制左边剩下的 TmpA[Tmp++]= A[L++];while(R<=RightEnd)//直接复制右边剩下的TmpA[Tmp++]=A[R++];for(int i=0;i<NumElement;i++,RightEnd--)A[RightEnd]=TmpA[RightEnd];//从TmpA数组复制回A数组
}
//递归排序
/*A原数组TmpA临时数组L左端点RightEnd右端点    */
void Msort(int A[],int TmpA[],int L,int RightEnd){int Center;if(L<RightEnd){Center=L+(RightEnd-L)/2;Msort(A,TmpA,L,Center);Msort(A,TmpA,Center+1,RightEnd);Merge(A,TmpA,L,Center+1,RightEnd);}
}
//统一调用接口
void Merge_sort(int A[],int N){int *TmpA;TmpA=(int*)malloc(N*sizeof(int));if(TmpA!=NULL){Msort(A,TmpA,0,N-1);delete TmpA;}else exit(0);
}int main(){int a[100];srand((unsigned)time(NULL));cout<<"before Merge_sort"<<endl; for(int i=0;i<10;i++){a[i]=0+rand()%10;cout<<a[i]<<endl;}cout<<"after Merge_sort"<<endl;Merge_sort(a,10);   for(int i=0;i<10;i++)cout<<a[i]<<endl;}

排序结果

before Merge_sort
3
5
6
0
6
9
0
2
9
2
after Merge_sort
0
0
2
2
3
5
6
6
9
9

补充知识

malloc函数
malloc 函数返回的是 void * 类型,如果写成:p = malloc (sizeof(int)); 则程序无法通过编译,报错:“不能将 void* 赋值给 int * 类型变量”。所以必须通过 (int *) 来将强制转换。
使用后delete
包含在头文件cstdlib

随机数函数
srand((unsigned)time(NULL))
产生0-9之间的随机数0+rand()*10

srand函数包含在头文件ctime

C++归并排序递归写法相关推荐

  1. 动态规划的递归写法和递推写法

    动态规划是一种非常精妙的算法思想,它没有固定的写法,极其灵活,常常需要具体问题具体分析 什么是动态规划 动态规划(Dynamic Programming,DP)是一种用来解决一类最优化问题的算法思想. ...

  2. 4.二叉树的先序、中序以及后序遍历的递归写法与非递归写法(LeetCode第94、144、145题)

    一.递归法 这次我们要好好谈一谈递归,为什么很多同学看递归算法都是"一看就会,一写就废". 主要是对递归不成体系,没有方法论,每次写递归算法 ,都是靠玄学来写代码,代码能不能编过都 ...

  3. 转载:二叉树的前中后和层序遍历详细图解(递归和非递归写法)

    二叉树的前中后和层序遍历详细图解(递归和非递归写法) Monster_ii 2018-08-27 17:01:53 50530 收藏 403 分类专栏: 数据结构拾遗 文章标签: 二叉树 前序 中序 ...

  4. 二叉树前序、中序、后序遍历非递归写法的透彻解析

    前言 在前两篇文章二叉树和二叉搜索树中已经涉及到了二叉树的三种遍历.递归写法,只要理解思想,几行代码.可是非递归写法却很不容易.这里特地总结下,透彻解析它们的非递归写法.其中,中序遍历的非递归写法最简 ...

  5. 6-6 归并排序(递归法) (10分)

    6-6 归并排序(递归法) (10分) 本题要求实现二路归并排序中的归并操作,待排序列的长度1<=n<=1000. 函数接口定义: void Merge(SqList L,int low, ...

  6. 归并排序 (递归+非递归)

    文章目录 1. 归并排序 递归 1.基本思想 2. 使用两个函数完成归并 3. 递归结束条件 4.时间复杂度与空间复杂度计算 1. 时间复杂度 2. 空间复杂度 5. 代码 2. 归并排序 非递归 1 ...

  7. 二叉树的前序、中序、后序遍历(递归、非递归写法)

    文章目录 一.什么是二叉树? 二.二叉树的基本概念 三.二叉树的三种遍历方式 1.前序遍历(preordertraversal) 1.中序遍历(inordertraversal) 1.后序遍历(pos ...

  8. 【二叉树Java】二叉树遍历前序中序后序遍历的非递归写法

    本文主要介绍二叉树前序中序后序遍历的非递归写法 在探讨如何写出二叉树的前序中序后序遍历代码之前,我们先来明确一个问题,前序中序后序遍历根据什么区分? 二叉树的前序中序后序遍历,是相较根节点说的.最先遍 ...

  9. java 归并排序 非递归_归并排序-递归及非递归的JAVA实现

    归并排序介绍 平均时间复杂度: O(NLogN) 最好情况时间复杂度: O(NLogN) 最差情况时间复杂度: O(NLogN) 所需要额外空间: 递归:O(N + LogN), 非递归:O(N) 稳 ...

最新文章

  1. 这就是我为什么推荐使用var aa = for (var i = 0, l = aa.length; i < l; i++) {var a = aa[i];}循环的原因,每秒最快可以执行4000+次!
  2. EXPLAIN PLAN获取SQL语句执行计划
  3. 数据中心业务价值永续的密码——施耐德电气全生命周期服务
  4. 从央视到谷歌:聊一聊竞价广告的机制设计
  5. 如何控制订单发料后不能删除组件
  6. Python找出列表中出现次数最多的元素三种方式
  7. 大学计算机ppt操作表格,大学计算机应用基础第四章 电子表格软件Exc.ppt
  8. mysql 搜索正则表达式_[MySQL] 用正则表达式进行搜索
  9. java定义js函数_JS中可以先使用函数,然后再定义.
  10. 编程 小数位数_使用动态编程的n位数的非递减总数
  11. vscode php formatter mac配置_Mac上配置Vs code时,遇到的几个“坑”!
  12. MYSQL GROUP BY 对多个字段进行分组
  13. 不为失败找理由,只为成功找方法
  14. iview组件的Table表格的内容过多时,显示title提示
  15. mybatis-plus 从2.x到3.x升级指南
  16. IM在线聊天-微聊即时通讯完整源码
  17. Java实现二维码的生成
  18. python基础:sys模块
  19. Ubuntu 20.04安装字体
  20. 个人公众号注销方法_微信公众号注销后可以再申请吗 公众号注销帐号方法介绍...

热门文章

  1. php中读取大文件实现方法详解
  2. [题解]BZOJ1004 序列函数
  3. IOS消息机制-委托(ptotocol与delegate)
  4. moss中修改master页需要注意的地方
  5. Loss Function , Cost Function and Kernel Function in ML(To be continued)
  6. 高级经济师计算机水平考试,【2017上海高级经济师评审职称外语、计算机成绩不再为前置条件】- 环球网校...
  7. 【Paper】2019_Bearing-only circumnavigation control of the multi-agent system around a moving target
  8. 径向基RBF(radial basis function)函数、RBF神经网络、 反推(back-stepping)控制
  9. 【PC工具】简单好用的截屏gif录制小软件
  10. Java版本多用户B2B2C商城源码-(八)消息总线(Spring Cloud Bus)