最大最小值:给n个实数,求它们之中的最大值和最小值,要求比较次数尽量小。
2014-04-15 12:14
399 查看
最大最小值给n个实数,求它们之中的最大值和最小值,要求比较次数尽量小。
用递归的方法可以做。假设需要T(n)的时间求n个数的最大值和最小值,显然T(2) = 1。我们按照分治三步法进行算法设计。
划分把n个数均分为两半。
递归求解求左半的最小值minL 和最大值maxL以及右半最小值minR和最大值maxR。
合并所有数的最大值为maxfmaxL; maxRg,最小值为minfminL; minRg。
程序如下。划分点为m = (l+r)/2,两个区间为[l,m]和[m+1,r](注意不是[l,m-1]和[m,r])
用递归的方法可以做。假设需要T(n)的时间求n个数的最大值和最小值,显然T(2) = 1。我们按照分治三步法进行算法设计。
划分把n个数均分为两半。
递归求解求左半的最小值minL 和最大值maxL以及右半最小值minR和最大值maxR。
合并所有数的最大值为maxfmaxL; maxRg,最小值为minfminL; minRg。
程序如下。划分点为m = (l+r)/2,两个区间为[l,m]和[m+1,r](注意不是[l,m-1]和[m,r])
void minmax (int l , int r , int & min , int & max) { int minl , minr , maxl , maxr ; if(r == l){ max = min = a[l ]; } else if(r == l+1) { if(a[l] > a[r] { max = a[l]; min = a[r]; } else { max = a[r]; min = a[l]; } } else { int m = (l+r) >> 1; minmax (l, m, minl, maxl ); minmax (m+1, r, minr, maxr); max = maxl > maxr ? maxl : maxr ; min = minl < minr ? minl : minr ; } }
相关文章推荐
- 【读书笔记-《Android游戏编程之从零开始》】2.Hello,World!
- 解析XML DOM
- CFileDialog弹出文件选择对话框
- Autodesk 招人了,开发顾问,感兴趣的或者有推荐的人扔简历过来啊
- [转]SpecFlow使用入门
- memcache在微信公众平台的运用
- php三维数组变二维数组
- Part5 第一个MapGIS云GIS软件程序
- 第八周上机实践项目——实现复数类中的运算符重载(1)
- 反汇编吸星大法-IDA神器特殊之处
- Pro Android学习笔记(八三):了解Package(2):包签名过程
- XML DOM节点树
- erlang程序优化点的总结
- 梦想的方向
- MyEclipse设置注释格式(转载)
- 用Windows + VS搭建Cocos2d-x引擎与新建项目教程
- jQuery获取Select选择的Text和Value:
- CDB和PDB基本管理
- java 正确 连接 bae 3.0 MySQL 最简单有效的方法
- PAT 1078. Hashing (模拟)