昨天写了,归并排序子函数的实现。今天,我们来分析一下,归并排序算法整体的实现过程。数组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类似。
最后,给出总的执行结果图:
左半边的结果:
右半边的结果:
最后合并的结果:
源代码代码