算法分析之归并排序——算法整体实现过程
2016-04-07 11:42
447 查看
昨天写了,归并排序子函数的实现。今天,我们来分析一下,归并排序算法整体的实现过程。数组A为待排序数组,A的数组元素如下:5、2、4、7、1、3、2、6,数组下标从0开始。
![](http://img.blog.csdn.net/20160406225504198)
1.我们调用归并排序算法:
归并排序算法的具体实现过程如下:
p为数组元素的起始下标,r为终止下标,因此在数组A中p=0,r=7
归并排序的具体执行过程如下图:执行过程自底向上。
![](http://img.blog.csdn.net/20160406232220383)
merge函数在上一篇博文里面详细介绍过,此处不再赘述。今天,我们主要分析
merge_sort(int A[],int p,int r)函数递归执行的整个过程。
首先,涉及到一点点堆栈的知识,每声明一个函数,系统会为他开辟一块新的栈空间,用来存放函数的局部变量以及函数函数的地址。递归函数每次返回时,返回上一个函数。
下图是针对此例画的执行步骤图,序号代表执行步骤。
![](http://img.blog.csdn.net/20160407113307999)
此处举例只举到步骤19,19之后的执行步骤与9类似。
最后,给出总的执行结果图:
左半边的结果:
![](http://img.blog.csdn.net/20160407113736001)
右半边的结果:
![](http://img.blog.csdn.net/20160407113828798)
最后合并的结果:
![](http://img.blog.csdn.net/20160407113937017)
源代码代码
1.我们调用归并排序算法:
merge_sort(A,0,length-1);
归并排序算法的具体实现过程如下:
p为数组元素的起始下标,r为终止下标,因此在数组A中p=0,r=7
/******************合并排序递归调用*******************/ void merge_sort(int A[],int p,int r) { int q; if(p<r) { q=(p+r)/2;//计算q的值,即将问题拆分成两个子问题; merge_sort(A,p,q); //左半边递归调用merge_sort,缩小问题规模 printf("\n"); merge_sort(A,q+1,r);//右半边递归调用merge_sort,缩小问题规模 printf("\n"); merge(A,p,q,r); } } /*****************************************************/
归并排序的具体执行过程如下图:执行过程自底向上。
merge(A,p,q,r);
merge函数在上一篇博文里面详细介绍过,此处不再赘述。今天,我们主要分析
merge_sort(int A[],int p,int r)函数递归执行的整个过程。
首先,涉及到一点点堆栈的知识,每声明一个函数,系统会为他开辟一块新的栈空间,用来存放函数的局部变量以及函数函数的地址。递归函数每次返回时,返回上一个函数。
下图是针对此例画的执行步骤图,序号代表执行步骤。
此处举例只举到步骤19,19之后的执行步骤与9类似。
最后,给出总的执行结果图:
左半边的结果:
右半边的结果:
最后合并的结果:
源代码代码
相关文章推荐
- Perplexity定义
- mysql5.7.11服务无法启动,错误代码3534
- 设计模式
- 热爱的吉他
- 极光推送swift语言
- C++作业3
- c++第三次实验
- web前端新手向HTML+CSS+JavaScript实现列表的增删查改【施工中】
- JSONObject put,accumulate,element的区别
- c++上机作业----个人所得税计算器
- activity的生命周期
- 智能生活 科技无限 CTO VOICE 第二期 智能硬件创新创业专场演讲嘉宾招募
- Objective-c 内存管理-僵尸对象
- zz:Android 内存优化测试
- Android Studio failed to resolve .....
- zz:Android-----WebView使用
- 二叉树的生成与遍历
- 表单标签
- OpenCV中CvArr* 的含义~
- c++实验三-个人所得税计算器