二分查找
2015-11-21 18:11
281 查看
//递归法 int BinarySearch(int a[], int b, int e, int x) { if (b > e){ return -1; } int m = b + ((e - b)>>1);//middle= (left+right)>>1; 这样的话left与right的值比较大的时候,其和可能溢出。 if (x < a[m]){ return BinarySearch(a, b, m-1, x); } if (x > a[m]){ return BinarySearch(a, m+1, e, x); } return m; }
//循环法 int BinarySearch2(int a[], int b, int e, int x) { if (b > e){ return -1; } while (b <= e){ int m = (b+e)/2; if (x < a[m]){ e = m-1; } else if (x > a[m]){ b = m+1; } else { return m; } } return -1; }二分查找需要判断三种情况: 大于,小于,等于。只要找到与目标值相等的值就结束了。二分查找需要注意的地方: 1.递归或循环时,退出的条件,当 begin > end时,才退出。注:当begin = end时,还需要取平均值mid,再比较一次2.mid 的获取: mid = begin + (end - begin)/2。注: mid的获取有两种情况: (end - begin)/2 会取下界;mid也可以取上界,(end-begin+1)/2;int BSearchUpperBound(int a[], int b, int e, int x){if (b > e || x >= a[e]){return -1;}int m = (b+e)/2;while (b < e){if (x < a[m]){e = m;}else{b = m+1;}m = (b+e)/2;}return m;}
//用二分查找法找寻上届
二分法查找上界需要判断两种情况:大于,不大于。算法需要一直二分,直到begin=end时,此时这个位置的值就是所要查找的上界。
1.循环条件:begin<end,当begin>=end时,退出。
2.mid = begin+(end-begin)/2,当a[mid] > 目标值x时,end = mid;否则,begin = mid+1;
3.mid的获取只能 mid=begin+(end-begin)/2;若mid=begin+(end-begin+1)/2的话,在下面这个情况会死循环: 目标值x=10,在{10,11}这求x的上界。
int BSearchLowerBound(int a[], int b, int e, int x){if ( b>e || x <= a[b] ){return -1;}int m = b+ ((e-b+1)>>1);while(b < e){if ( a[m] < x){b = m;}else{e = m-1;}m = b+((e-b+1)>>1);}return m;}
//用二分查找法找寻下届与上界的查找相反。
相关文章推荐
- HMC创建AIX
- Windows Server 2008 R2入门之文件服务器
- [笔记-架构探险]框架优化与功能扩展3.2.安全框架shiro、提供安全控制特性2-jsp页面标签和框架aop启用权限控制
- linux 命令 多一个窗口
- 并发和竞态
- UVA - 253 Cube painting(骰子涂色)
- MapReduce
- 利用linux 内核所提供的input子系统编写字符设备驱动的步骤
- 【Android】Android插件开发 —— 打开插件的Activity(预注册方式)
- AFN监测网络状态
- ls- 查看linux 文件的大小
- 驱动模型
- Linux下的proc目录详解
- c语言俄罗斯方块
- 基于 platform 总线的设备驱动编写模式:
- RAC DATAGUARD primary listener
- Asp.net中实现同一用户名不能同时登录(单点登录)
- Socket套接字
- php cli模式和浏览器访问下加载php.ini文件的注意事项[架构篇]
- setInterval和setTimeout