五大常用算法(一) 分治算法(1) 二分查找
来源:互联网 发布:中传在线网络登录 编辑:程序博客网 时间:2024/05/17 03:14
本文章参考自:http://blog.163.com/wujiaxing009@126/blog/static/71988399201241481757657/
1.最基础的二分查找:
#include <iostream>using namespace std;int bsearch(int t[],int k,int n){ int low = 0; int high = n - 1; int mid; while(low <= high){//等于的情况才是最普遍的情况,不能忘记等于号 mid = (low + high) / 2; if( k == t[mid]) return mid; else if(k < t[mid]) high = mid - 1; else low = mid + 1; } return -1;}int main(){ int t[10]; for(int i = 0; i < 10; i++){ cin >> t[i]; } //sort... for(int i = 0; i < 10; i++) cout << t[i] << " "; cout << endl; int k; cin >> k; cout << bsearch(t,k,10)<<endl; return 0;}
或者写为递归的形式也可以实现二分查找。
若出现了重复的情况:则可以为:
#include <iostream>using namespace std; int bsearch(int *t,int k,int n){ int low=0,high=n-1,mid; while (low<=high) { mid=(low+high)/2; if (k==t[mid]) { while(t[mid] == k) { mid--; } return mid+1; } else if (k<t[mid]) high=mid-1; else low=mid+1; } return -1;}int main(){ int t[10]; for(int i = 0; i < 10; i++){ cin >> t[i]; } //sort... for(int i = 0; i < 10; i++) cout << t[i] << " "; cout << endl; int k; cin >> k; cout << bsearch(t,k,10)<<endl; return 0;}
为了提高效率,我们使用分治的方法改进如下:
#include <iostream>using namespace std; int bsearch(int *t,int k,int n){ int high = n - 1; int low = 0; int mid; int flag = -1; while(low <= high){ mid = (low+high) / 2; if(t[mid] == k){ flag = mid;//保存上次查找的信息 high = mid - 1;//找第一次出现k的位置,所以往左边找 } else if(k < t[mid]) high = mid - 1; else low = high + 1; } if(flag == -1) return -1; else return flag;}int main(){ int t[10]; for(int i = 0; i < 10; i++){ cin >> t[i]; } //sort... for(int i = 0; i < 10; i++) cout << t[i] << " "; cout << endl; int k; cin >> k; cout << bsearch(t,k,10)<<endl; return 0;}
- 五大常用算法(一) 分治算法(1) 二分查找
- 五大常用算法(一) 分治算法
- 五大常用算法(一)分治算法
- 五大常用算法(一) 分治算法(2) 大整数乘法
- 二分查找(分治算法)
- 五大常用算法之一:分治算法
- 五大常用算法之一:分治算法
- 五大常用算法之一:分治算法
- 五大常用算法之一:分治算法
- 五大常用算法之一:分治算法
- 五大常用算法之一:分治算法
- 五大常用算法之一:分治算法
- 五大常用算法之一:分治算法
- 五大常用算法之一:分治算法
- 五大常用算法之一:分治算法
- 五大常用算法之一:分治算法
- 五大常用算法之一:分治算法
- 五大常用算法之一:分治算法
- 从程序员到项目经理(2):新任项目经理的误区
- 五大常用算法(一) 分治算法
- string对象与数值相互转换
- 利用ASP发送和接收XML数据的处理方法
- shell脚本实现无密码交互的SSH自动登陆
- 五大常用算法(一) 分治算法(1) 二分查找
- pcm音频合并噪音问题
- [5月2日的脚本] 核对 SQL Server加密证书不存在备份问题 (VBS)
- 如何让ajaxfileupload.js支持IE9,IE10,并可以传递多个参数?
- 五大常用算法(一) 分治算法(2) 大整数乘法
- HP-UX 主机巡检-nickel 脚本命令细细读--系统信息
- SPOJ GSS7 && Vijos1620 【LCT】
- 阿里巴巴2013年实习生笔试题
- iOS消息推送 的一些收集