归并排序算法---分治+双递归

归并排序运用分治算法与递归思想,那么其双递归究竟是怎样的呢?今天被困扰了一会一直觉得并没有完全理解,后通过思考以及查阅资料,弄懂了其递归的真正实现过程!

写给已了解归并排序的Coder
Code:

void Merge(int r[],int r1[],int s,int m,int t)
//归并子序列
{
    int i=s,j=m+1;
    int k=s;
    while(i<=m&&j<=t)
    {
        if(r[i]<=r[j]) r1[k++]=r[i++];
        else r1[k++]=r[j++];
    }
    while(i<=m) r1[k++]=r[i++];
    while(j<=t) r1[k++]=r[j++];
}
void MergeSort(int r[],int s,int t)
{
    int m,r1[1000];
    if(s==t) return;//递归的边界条件 只有一个记录 已经有序
    else
    {
        m=(s+t)/2;//划分
        //1
        MergeSort(r,s,m); //求解子问题1,归并排序前半个子序列
        //2
        MergeSort(r,m+1,t);//求解子问题2,归并排序后半个子序列
        //3
        Merge(r,r1,s,m,t);//合并两个有子序列,结果存放在数组r1中
        //4
        for(int i=s;i<=t;i++)
            r[i]=r1[i];//将有序序列传回数组r中
    }
}

首先一定要明白在递归中每一个条语句是具有相同的执行顺序的。也就是说每次在MergeSort函数中我所标的1 2 3 4是具有相同的执行顺序的~

上图说明 为节约时间 直接插图了
假设s=1 t=8

看好上方代码的1 2 3 4条语句标注
一.就是说到最后s=1 t=2的时候(此时相当于"二位置"在执行1语句),此时MergeSort会执行完1语句(此时调用函数时s=1 t=1会执行return语句),之后执行2语句(此时调用函数是s=1 t=1会执行return语句),再然后依次执行3语句,4语句。

二.这样执行完过后图片标注的"二位置"才会去执行2语句,执行完2语句之后"三位置右边蓝色部分"会产生和一步骤相同的操作!

三.那么"二位置"是不是就相当于最上层函数执行完1语句呢?

在这里插入图片描述
我的理解就是这样 感觉对于复杂递归 从根去理解好还是需要好好去思考的

发布了19 篇原创文章 · 获赞 2 · 访问量 752

猜你喜欢

转载自blog.csdn.net/qq_45639157/article/details/104738755