社区
数据结构与算法
帖子详情
这个递归过程怎么解?
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);
}
...全文
107
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]
既然 子问题已经解决
再把 子问题合并就能得出原来大问题的解了
递推与
递归
(区别)
本文深入
解
析了
递归
与递推两种算法的核心概念、优缺点及其应用场景,通过实例对比了
递归
与递推在
解
决斐波那契数列、求和与爬楼问题中的具体实现。
算法-
递归
算法
本文深入探讨了
递归
的概念,包括其退出条件、基本思想和
递归
调用
过程
。通过斐波那契数列、上楼梯问题及汉诺塔等经典实例
解
析
递归
算法,并指出
递归
可以转换为非
递归
形式。同时提醒读者,
递归
虽简洁但可能非最优
解
,使用尾
递归
可优化。最后,强调
递归
在链表、二叉树等问题上的应用,以及如何构建自己的
递归
解
决方案。
回溯算法可视化:直观理
解
递归
与回溯
过程
回溯算法是
解
决组合优化等问题的关键方法,但
递归
与回溯
过程
抽象。本文通过生活案例、代码演示和动态示意图,将其可视化。介绍了核心概念,以全排列问题为例讲
解
算法原理,还展示了项目实战、应用场景,探讨了未来趋势与挑战。
【数据结构与算法】第十八篇:
递归
,尾
递归
,尾调用
文章详细介绍了
递归
的概念,通过实例分析了斐波那契数列、青蛙跳台阶和汉诺塔问题的
递归
解
决方案,并探讨了
递归
的优化方法,包括记忆化和尾
递归
优化。同时,讨论了如何将
递归
转换为非
递归
实现。
算法策略 -
递归
(Recursion)
本文深入
解
析
递归
编程技巧,涵盖
递归
定义、调用
过程
、边界条件设定、常见问题如斐波那契数列和汉诺塔的
递归
解
法,以及如何优化
递归
避免栈溢出。
数据结构与算法
33,026
社区成员
35,336
社区内容
发帖
与我相关
我的任务
数据结构与算法
数据结构与算法相关内容讨论专区
复制链接
扫一扫
分享
社区描述
数据结构与算法相关内容讨论专区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章