这个递归过程怎么解?

zexin1000 2009-06-17 06:29:54
请问高手合并排序,这个是递归的,但是搞不懂它的来龙去脉,为什么这么写就可以实现合并排序呢?


void mergesort(int a[],int l,int r)
{
int m=(r+l)/2;
if(r<=l)
return;
mergesort(a,l,m);
mergesort(a,m+1,r);
printf("Now the sort result is:\n");

merge(a,l,m,r);

}
...全文
53 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
xizenyin 2009-06-29
  • 打赏
  • 举报
回复
学习up
AYZBL 2009-06-18
  • 打赏
  • 举报
回复
只有这段程序是实现不了合并排序的,大哥。

这个merge() 函数,才是最难写的,我以前写过的。

你这个mergesort()只是把一个数组,不断分成1/2 ,然后对每个1/2再进行合并排序。

然后排完序的两个1/2 子数组,还必须合并成一个数组,这就是merge()的工作了。
zhangbiao1981 2009-06-18
  • 打赏
  • 举报
回复
递归的本质是数学归纳法,分为基础条件和假设,归纳三步。
基础是:只有一个元素时是有序的
假设是:mergesort(a,l,r) 能排序a数组[l,r]范围中的元素
归纳是:merge(a,l,m,r); 能把两个有序的范围合成一个全体有序的范围
这个典型的分治法,可以参考wikipedia: http://en.wikipedia.org/wiki/Divide_and_conquer_algorithm
zhusizhi007 2009-06-18
  • 打赏
  • 举报
回复
找本算法设计的书看看吧,
瓶盒 2009-06-18
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 zhangbiao1981 的回复:]
递归的本质是数学归纳法,分为基础条件和假设,归纳三步。
基础是:只有一个元素时是有序的
假设是:mergesort(a,l,r) 能排序a数组[l,r]范围中的元素
归纳是:merge(a,l,m,r);  能把两个有序的范围合成一个全体有序的范围
这个典型的分治法,可以参考wikipedia:http://en.wikipedia.org/wiki/Divide_and_conquer_algorithm
[/Quote]
递归的本质是数学归纳法,学习了,不过感觉下面的假设和归纳有问题。整理下思路
数学归纳法的核心在于,假设对公式S(n)当n=k时成立,则能逻辑的推出n=k+1时,公式S(n)也是成立的。
这里S(k)是否成立并不知道,但由上面我们能够得知,如果S(k-1)能成立则S(k)就肯定成立,但S(k-1)是否成立也是不知道的,不过仍能依次向上假设,假设到S(k-m)成立时,这里如果k-m=1,则这个假设是正确的,从而就能够再逐次论证回去。
对于归并排序问题,前提假设应该是如果两个数组[1,m],[m+1,r]是有序数组,那么我们能用一个合并方法merge(a,l,m,r)把这两个数组合并为一个有序数组,这两个数组是否有序是不知道的,但是我们可以把每个数组一分为二,然后假如分开的两个数组是有序的,用我们的合并方法得到的数组肯定也是有序的,在不知道分开的两个数组是否有序的情况下,我们就必须一直分下去,当分解到两个数组每个不多于一个元素的情况下,这时这两个子数组肯定是有序的,此时把两个子数组用合并方法得到的合集必然有序。再逐次递推回去,则最终的合集数组[1,r]必将有序。
sunzerui 2009-06-18
  • 打赏
  • 举报
回复
这不是分治法 + 递归吗
先在中间分开,然后依次排序前半段和后半段。
在分段和排序的同时,又依次在中间分开然后递归下去
直到 最后一个元素。
Tippisum 2009-06-18
  • 打赏
  • 举报
回复
merge需要一个归并算法。
这个很简单
merge(int a[],int l,int m,int r)
{
int b[r-l]
int i=l
int j=m
int k=0
re:
if (a[i]<=a[j])
{
b[k]=a[i];
i++
else
{
b[k]=a[j];
j++
}
k++
if (k<r-l)
goto re
for (i=0,i<r-l,i++)
a[i+l]=b[i]
}

事实上分治法的“分”很简单,但是“合”的算法却是最关键的
zexin1000 2009-06-17
  • 打赏
  • 举报
回复
那要弄懂他是只要体会他这个思想就好,还是要搞一个实例,自己试试过程是怎样的呢?
类似这个递归感觉要是按他的过程来一步一步写下来,要花很多时间和很费力气,是不是只要记住他的思想就行了?
贝隆 2009-06-17
  • 打赏
  • 举报
回复
飘过
piaomiaoju 2009-06-17
  • 打赏
  • 举报
回复
你要用递归,假设的思想去思考这个问题,
就是一定要站在一个基础上
这个基础就是:假设:mergesort(a,l,r) 能排序a数组中的元素,
那么 分治法把原来分成两个子问题,排序[a,l,m],[a,m+1,r]
既然 子问题已经解决
再把 子问题合并就能得出原来大问题的解了

33,010

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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