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

昨天写了,归并排序子函数的实现。今天,我们来分析一下,归并排序算法整体的实现过程。数组A为待排序数组,A的数组元素如下:5、2、4、7、1、3、2、6,数组下标从0开始。
数组A
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类似。
最后,给出总的执行结果图:
左半边的结果:
左半边的执行结果
右半边的结果:
右半边的执行结果
最后合并的结果:
这里写图片描述
源代码代码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值