您的位置:首页 > 其它

算法分析之归并排序——算法整体实现过程

2016-04-07 11:42 447 查看
昨天写了,归并排序子函数的实现。今天,我们来分析一下,归并排序算法整体的实现过程。数组A为待排序数组,A的数组元素如下:5、2、4、7、1、3、2、6,数组下标从0开始。



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类似。

最后,给出总的执行结果图:

左半边的结果:



右半边的结果:



最后合并的结果:



源代码代码
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: