归并排序 递归的地方不懂啊,求指点,我想知道第一个递归一层层递归下去后,后面的两个函数怎么执行的,函数返回的时候,后面两个又是如何执行的,确实费解啊。。。。

啦啦啦啦啦啦妮妮 2013-08-30 07:40:09

void chaild_sort(int a[],int end[],int s,int t)
{
void real_sort(int temp[],int end[],int s,int m,int t);
int m;
int temp[sizeof(a)/sizeof(int)];
if(s==t)
{
end[s]=a[s];
}
else
{
m=(s+t)/2;
chaild_sort(a,temp,s,m);
chaild_sort(a,temp,m+1,t);
real_sort(temp,end,s,m,t);
}
}
...全文
111 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
max_min_ 2013-08-31
  • 打赏
  • 举报
回复
不都是一样的么? 第一次进去else ,调用第一个函数本身,递归,后面函数接口等待! 然后进去函数 满足if则次接口调用完成,不满足继续进去递归,后面的两个函数接口继续等待! 画图就明显了!
  • 打赏
  • 举报
回复
引用 1 楼 woshinia 的回复:
可以这么理解,最外面的是chaild_sort0,chaild_sort0里面的2个为chaild_sort00和chaild_sort01,chaild_sort00里面的2个是chaild_sort000和chaild_sort001,chaild_sort01里面的2个是chaild_sort010和chaild_sort011,这样一直下去直到s=t。 简单看一下3层的话,执行的顺序是chaild_sort0 -> chaild_sort00 -> chaild_sort000 -> "s==t退出" -> chaild_sort001 -> "s==t退出" -> “chaild_sort00退出”-> chaild_sort01 -> chaild_sort010 -> "s==t退出"---chaild_sort011 -> "s==t退出" -> “chaild_sort01退出” -> “chaild_sort0退出” 形象一点的话,就类似于windows的资源管理器,先打开我的电脑,然后开C盘,然后打开C盘中的文件夹A,A中空了,回退,再开C中的文件夹B,B也空了,回退,C中也没其他文件夹了,就退出C,进入D,在D中发生了和C盘差不多的过程,然后退到我的电脑,最后我的电脑退回桌面。 递归的话,主要是确定原问题与子问题的结构,只有原问题和子问题的结构一致才好递归。 归并的结构是2个有序的数组,通过前端比较,能合并成1个更长的数组。而那2个有序的数组,也可以分别用这种方法得到。所以相同的结构就是(1)得到有序数组A(2)得到有序数组B(3)合并这2个数组。代码就是这个意思,并且递归的目的就是为了让代码更易于理解。
引用 1 楼 woshinia 的回复:
可以这么理解,最外面的是chaild_sort0,chaild_sort0里面的2个为chaild_sort00和chaild_sort01,chaild_sort00里面的2个是chaild_sort000和chaild_sort001,chaild_sort01里面的2个是chaild_sort010和chaild_sort011,这样一直下去直到s=t。 简单看一下3层的话,执行的顺序是chaild_sort0 -> chaild_sort00 -> chaild_sort000 -> "s==t退出" -> chaild_sort001 -> "s==t退出" -> “chaild_sort00退出”-> chaild_sort01 -> chaild_sort010 -> "s==t退出"---chaild_sort011 -> "s==t退出" -> “chaild_sort01退出” -> “chaild_sort0退出” 形象一点的话,就类似于windows的资源管理器,先打开我的电脑,然后开C盘,然后打开C盘中的文件夹A,A中空了,回退,再开C中的文件夹B,B也空了,回退,C中也没其他文件夹了,就退出C,进入D,在D中发生了和C盘差不多的过程,然后退到我的电脑,最后我的电脑退回桌面。 递归的话,主要是确定原问题与子问题的结构,只有原问题和子问题的结构一致才好递归。 归并的结构是2个有序的数组,通过前端比较,能合并成1个更长的数组。而那2个有序的数组,也可以分别用这种方法得到。所以相同的结构就是(1)得到有序数组A(2)得到有序数组B(3)合并这2个数组。代码就是这个意思,并且递归的目的就是为了让代码更易于理解。
谢谢你!!回答的很详细!!分数不多,请多多包涵哈!
woshinia 2013-08-30
  • 打赏
  • 举报
回复
可以这么理解,最外面的是chaild_sort0,chaild_sort0里面的2个为chaild_sort00和chaild_sort01,chaild_sort00里面的2个是chaild_sort000和chaild_sort001,chaild_sort01里面的2个是chaild_sort010和chaild_sort011,这样一直下去直到s=t。 简单看一下3层的话,执行的顺序是chaild_sort0 -> chaild_sort00 -> chaild_sort000 -> "s==t退出" -> chaild_sort001 -> "s==t退出" -> “chaild_sort00退出”-> chaild_sort01 -> chaild_sort010 -> "s==t退出"---chaild_sort011 -> "s==t退出" -> “chaild_sort01退出” -> “chaild_sort0退出” 形象一点的话,就类似于windows的资源管理器,先打开我的电脑,然后开C盘,然后打开C盘中的文件夹A,A中空了,回退,再开C中的文件夹B,B也空了,回退,C中也没其他文件夹了,就退出C,进入D,在D中发生了和C盘差不多的过程,然后退到我的电脑,最后我的电脑退回桌面。 递归的话,主要是确定原问题与子问题的结构,只有原问题和子问题的结构一致才好递归。 归并的结构是2个有序的数组,通过前端比较,能合并成1个更长的数组。而那2个有序的数组,也可以分别用这种方法得到。所以相同的结构就是(1)得到有序数组A(2)得到有序数组B(3)合并这2个数组。代码就是这个意思,并且递归的目的就是为了让代码更易于理解。

64,633

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧