社区
数据结构与算法
帖子详情
这个递归过程怎么解?
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);
}
...全文
77
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文件
通过对算法运行
过程
的分析,我们可以预测算法在大数据量下的表现,从而选择更适合的
解
决方案。 3. **排序与查找**:常见的排序算法如冒泡排序、插入排序、选择排序、快速排序、归并排序、堆排序等,以及查找算法如...
递归
的定义?何时使用
递归
?
递归
模型?
递归
执行
过程
?常见的
递归
思想的例题和实现?
递归
递归
定义:
递归
是指函数的定义中又调用函数自身的方法。 例题 求n(n为正整数)的阶乘 ...这里需要注意的是
递归
问题的求
解
过程
一般都需要返回值,在
递归
问题中没有返回值,会导致语法错误。...
什么是
递归
目录 一、什么是
递归
? 二、为什么使用
递归
?...1、
递归
是一种非常高效、简洁的编码技巧,一种应用非常广泛的算法,比如DFS深度优先搜索、前中后序二叉树遍历等都是使用
递归
。 2、方法或函数调用自身...
递归
算法和
过程
的详
解
看了很多博主的博文,加上看了几个视频,做了一些题目,感觉对
递归
有了一些认识,希望大家观看以后会对自己有所帮助。...2 所描述问题的最简单的情况,它是一个能控制
递归
过程
结束的条件,称为基本条件。
深入理
解
递归
函数
递归
函数:我们把一个直接调用自己或通过一系列的调用语句间接地调用自己的函数,称做
递归
函数。 一直都对
递归
有种敬畏之情,因为之前在一家公司里是不让写
递归
的,我记得当时的理由是
递归
代码比较晦涩,所以自己也...
数据结构与算法
33,027
社区成员
35,335
社区内容
发帖
与我相关
我的任务
数据结构与算法
数据结构与算法相关内容讨论专区
复制链接
扫一扫
分享
社区描述
数据结构与算法相关内容讨论专区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章