社区
数据结构与算法
帖子详情
这个递归过程怎么解?
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);
}
...全文
80
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
作业
写回复
配置赞助广告
用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]
既然 子问题已经解决
再把 子问题合并就能得出原来大问题的解了
结构之法算法之道blog最新博文集锦第6期CHM文件
结构之法算法之道blog最新博文集锦第6期CHM文件,1月13日制作,请君享受。
递归
的定义?何时使用
递归
?
递归
模型?
递归
执行
过程
?常见的
递归
思想的例题和实现?
递归
递归
定义:
递归
是指函数的定义中又调用函数自身的方法。 例题 求n(n为正整数)的阶乘 int fun(int n){ if(n==1) { return 0; } else { return (fun( n-1)*n); } } 这里需要注意的是
递归
问题的求
解
过程
一般都需要返回值,在
递归
问题中没有返回值,会导致语法错误。...
什么是
递归
目录 一、什么是
递归
? 二、为什么使用
递归
?
递归
的优缺点? 三、什么样的问题可以用
递归
解
决呢? 四、如何实现
递归
? 1、
递归
代码编写 2、
递归
代码理
解
五、
递归
常见问题及
解
决方案 六、如何将
递归
改写为非
递归
代码? 一、什么是
递归
? 1、
递归
是一种非常高效、简洁的编码技巧,一种应用非常广泛的算法,比如DFS深度优先搜索、前中后序二叉树遍历等都是使用
递归
。 2、方法或函数调用自身...
深入理
解
递归
函数
1.
递归
函数概念介绍以及个人对
递归
的理
解
先给出一个概念:
递归
函数:我们把一个直接调用自己或通过一系列的调用语句间接地调用自己的函数,称做
递归
函数。 一直都对
递归
有种敬畏之情,因为之前在一家公司里是不让写
递归
的,我记得当时的理由是
递归
代码比较晦涩,所以自己也就一直没有对
递归
深入的了
解
,但是随着时间的推移,我感觉有的时候,用
递归
写的代码是优雅的,
递归
应该算作是一种算法,或者编程技巧。当然
递归
也有自己的缺点,它会有函数间的不断调用,函数调用栈是比较消耗时间和内存的,同时如果
递归
结束条件写的不对,也会造成
如何理
解
递归
的原理?
** 什么是
递归
算法?什么是
递归
?(英语:recursion algorithm) ** 在计算机科学中
递归
是通过重复将问题分
解
为同类的子问题而
解
决问题的方法。
递归
方法可以被用于
解
决很多的计算机科学问题,因此它是计算机科学中十分重要的一个概念,计算理论可以证明
递归
的作用可以完全取代循环。随着科技的发展,计算理论会更多的应用于其他领域。 ============= 所谓
递归
顾名思义就是在
过程
或函数里调用自身
递归
在数学中,
递归
算法是一种直接或者间接调用自身函数或者方法的算法。 通俗来说,
递归
算法的实质是把
数据结构与算法
33,027
社区成员
35,336
社区内容
发帖
与我相关
我的任务
数据结构与算法
数据结构与算法相关内容讨论专区
复制链接
扫一扫
分享
社区描述
数据结构与算法相关内容讨论专区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章