博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
汉诺塔问题, 用递归方法求集合中的中位数
阅读量:6689 次
发布时间:2019-06-25

本文共 1755 字,大约阅读时间需要 5 分钟。

打印解决汉诺塔问题的所有步骤

1 void Move(int n, int start, int goal, int temp) 2 { 3     if (n >= 1) 4     { 5         Move(n - 1, start, temp, goal);        //将最上面的n-1个盘子移到temp柱子上 6         printf("Move disk %d from %d to %d.\n", n, start, goal);    //将第n个柱子移到goal柱子上 7         Move(n - 1, temp, goal, start);        //将temp柱子上的n - 1个柱子移到goal柱子上 8     } 9         10     11 }

 用递归方法求集合中的中位数

1 void Swap(ElementType *X, ElementType *Y) 2 { 3     ElementType temp; 4     temp = *X; 5     *X = *Y; 6     *Y = temp; 7 } 8  9 ElementType FindKthLargest(ElementType s[], int K, int Left, int Right)10 {    //在s[Left]……s[Right]中找第K大的元素11     ElementType e = s[Left];        //简单取首元素为基准12     int L = Left, R = Right;13     14     while (1)15     {16         while ((Left <= Right) && (e <= s[Left])) Left++;    17         while ((Left < Right) && (e > s[Right])) Right--;18         if (Left < Right)19             Swap(&s[Left], &s[Right]);20         else21             break;    //最终brak退出时,Left一定指向第二个集合的第一个元素22     }23     Swap(&s[Left - 1], &s[L]);24     if ((Left - L - 1) >= K)25         return FindKthLargest(s, K, L, Left - 2);    //Left - 1是基准,所以下一次递归的右边界应该是Left - 226     else27     if ((Left - L - 1) < K - 1)28         return FindKthLargest(s, K - (Left - L - 1) - 1, Left, R);    //K 先减去第一个集合的Left - L - 1个元素,在减去基准元素,所以下一次递归应该是在第二个集合中求第K - (Left - L - 1) - 1个元素29     else30         return e;        //找到,返回31 }32 33 //封装前面这个查找函数34 ElementType Median(ElementType s[], int N)35 {36     return FindKthLargest(s, (N + 1) / 2, 0, N - 1);37 }

这个方法实际上利用了和快速排序相同的思路

简单选取S中的第一个元素e,根据e将集合S分为{e}和大于等于e的元素集合S1、小于e的元素集合S2; 然后通过判别集合S1的大小,将从S集合中找第K大数问题转换为在S1 和S2中的查找问题,由于S1或S2中的集合规模都比S小,这样就将复杂的问题转化为规模相对较小的问题,这也是递归函数的设计基础

转载于:https://www.cnblogs.com/hi3254014978/p/9717955.html

你可能感兴趣的文章
Zabbix教程-Zabbix配置文件详解
查看>>
VMware vSphere 5官方中文文档资料(附下载地址)
查看>>
我的友情链接
查看>>
WebRTC音视频引擎研究(2)
查看>>
解决dubbo问题:forbid consumer
查看>>
UTF-8 GBK UTF8 GB2312 之间的区别和关系
查看>>
我的友情链接
查看>>
软件开发中的用过的一些工具
查看>>
NO.151 配置禅道:设置是否允许匿名访问
查看>>
Afnetworking+nginx+https服务器通信
查看>>
php header
查看>>
6、单机运行环境搭建之 --CentOS-6.5安装MySQL 5.6.17并修改MySQL的root用户密码
查看>>
我的友情链接
查看>>
高效的API&服务管理的七个关键(最佳实践)
查看>>
查询数据库语句报错“数据类型 text 和 varchar 在 equal to 运算符中不兼容。"
查看>>
java spring jdbc Oracle DATE 类型读取时没有时分秒问题及解决方案
查看>>
面向对象与抽象编程的关系
查看>>
myeclipse8.x注册码
查看>>
聊聊Druid(二) -- 获取连接
查看>>
Dubbo与Zookeeper、SpringMVC整合和使用(负载均衡、容错)
查看>>