社区
数据结构与算法
帖子详情
这个递归过程怎么解?
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
打赏
收藏
这个递归过程怎么解?
请问高手合并排序,这个是递归的,但是搞不懂它的来龙去脉,为什么这么写就可以实现合并排序呢? 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); }
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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]
既然 子问题已经解决
再把 子问题合并就能得出原来大问题的解了
递
归的定义?何时使用
递
归?
递
归模型?
递
归执行
过程
?常见的
递
归思想的例题和实现?
递
归
递
归定义:
递
归是指函数的定义中又调用函数自身的方法。 例题 求n(n为正整数)的阶乘 ...这里需要注意的是
递
归问题的求
解
过程
一般都需要返回值,在
递
归问题中没有返回值,会导致语法错误。...
什么是
递
归
目录 一、什么是
递
归? 二、为什么使用
递
归?...1、
递
归是一种非常高效、简洁的编码技巧,一种应用非常广泛的算法,比如DFS深度优先搜索、前中后序二叉树遍历等都是使用
递
归。 2、方法或函数调用自身...
递
归算法和
过程
的详
解
看了很多博主的博文,加上看了几个视频,做了一些题目,感觉对
递
归有了一些认识,希望大家观看以后会对自己有所帮助。...2 所描述问题的最简单的情况,它是一个能控制
递
归
过程
结束的条件,称为基本条件。
如何理
解
递
归的原理?
递
归方法可以被用于
解
决很多的计算机科学问题,因此它是计算机科学中十分重要的一个概念,计算理论可以证明
递
归的作用可以完全取代循环。随着科技的发展,计算理论会更多的应用于其他领域。 ============= 所谓
递
归...
算法-
递
归算法
在使用
递
归
过程
中必须有个明确的
递
归结束条件,成为
递
归出口 3.
递
归算法通常很简洁,但
递
归算法
解
题的运行效率较低,一般不提倡这种算法 4.在
递
归调用的
过程
中系统为每一层的返回点,局部量等开辟栈来存储。
递
归...
数据结构与算法
33,010
社区成员
35,327
社区内容
发帖
与我相关
我的任务
数据结构与算法
数据结构与算法相关内容讨论专区
复制链接
扫一扫
分享
社区描述
数据结构与算法相关内容讨论专区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章