二分查找及STL

来源:互联网 发布:包就业java 培训班 编辑:程序博客网 时间:2024/06/05 04:52
二分查找及STL函数
一个人在决定与计算机打交道时,就注定与2分不开,当然不是说性格,2在算法中应用得极为广泛,倍增、二叉树、二分答案、快排、快速幂……当然,最基础的还是二分查找。
针对在一个序列中查找一个数的问题,我们当然可以暴力枚举,但是在面对大数据时,未免有些不够看,相信玩过猜数游戏的哥们应该知道怎么快速的猜到一个范围内数,那就是每次猜中间,这就是二分的思想,但是,这有一个前提:有序数列
先献上我丑陋的模板代码:
#include <bits/stdc++.h>using namespace std;int a[1000],p,n;int binary_s(int l,int r,int tar)//l是搜索范围左边界,r是右边界,tar是所搜索的数{int mid=(l+r)/2;//二分if(tar==a[mid])  return mid;//找到了就返回下标else if(a[mid]>tar)  binary_s(l,mid-1,tar);//大了,在更小的一半找else if(a[mid]<tar)  binary_s(mid+1,r,tar);//小了……}int main(){cin>>n;for(int i=1;i<=n;i++)  cin>>a[i];sort(a+1,a+n+1);//记得排序哦cin>>p;int temp=binary_s(1,n,p);cout<<a[temp]<<endl;return 0;}
接下来的几段对于纯代码爱好者就不用看了……对于二分这种常用函数当然是有STL的啦!
1.函数结构及种类
1.binary_search(目标数组头地址,搜索上界地址,目标数字);
2.lower_bound(目标数组头地址,搜索上界地址,目标数字);
3.upper_bound(目标数组头地址,搜索上界地址,目标数字);
2.返回值
1.binary_search返回一个布尔值,1就是找到了目标,0就是没有
2.lower_bound返回数组中第一个大于等于目标数字的地址!!地址!!
3.upper_bound返回数组中第一个大于目标数字的地址!!地址!!
3.注意事项
    1.有序数列,先sort一发
2.头文件啊#include <algorithm>
3.lower_bound和upper_bound返回值要转化为下标记得减一个头地址,像这样
int a[10000],n;lower_bound(a,a+10000,n)-a;upper_bound(a,a+10000,n)-a;


至于模板题……全网到处都是,谢谢