STL 二分查找
binary_search
注意:
1.[ , )
2.找到返回1,反之0
3.查找规则必须和排序规则相同
int a[100];
for(int i=10;i>=1;i--)
a[i]=i;
sort(a+1,a+11); //排序规则为升序
for(int i=1;i<=10;i++)
printf("%d ",a[i]);
cout<<endl; //查找规则默认为升序
cout<<binary_search(a+1,a+11,5)<<endl; //结果:1
排序、查找规则改变
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
struct rule
{
bool operator()(const int &a1,const int &a2)
{
return a1%10<a2%10;
};
};
int main()
{
int a[]={1,53,68,32,18,7,90,266,59,61};
int n=sizeof(a)/sizeof(int);
sort(a,a+n,rule());//个位数升序排列
for(int i=0;i<n;i++)
printf("%d ",a[i]);
cout<<endl;
cout<<binary_search(a,a+n,9,rule())<<endl;查找的9实则为个位数9 所以可以找到
cout<<binary_search(a,a+n,59,rule())<<endl;
return 0;
}
/*90 1 61 32 53 266 7 68 18 59
1
1*/
lower_bound() && upper_bound()
lower_bound(数组名+x,数组名+y,z,规则);
upper_bound(数组名+x,数组名+y,z,规则);
注意:
1.[x,y)
2.规则默认升序,要与数组的规则一致,与sort的规则一致,详见下
3.返回值为指针,如果能够找到 lower_bound=z,找不到lower_bound=y;
*4.lower_bound()-数组名=z的下标 不管你的数组是从0开始还是从1开始此公式都适用
int a[]={1,5,6,9,8,5,3,6,7,8};
int n=sizeof(a)/sizeof(1);
sort(a,a+n);
for(int i=0;i<n;i++)
printf("%d ",a[i]);
cout<<endl;
cout<<*lower_bound(a,a+n,5)<<" "<<lower_bound(a,a+n,5)-a<<endl;
cout<<*upper_bound(a,a+n,5)<<" "<<upper_bound(a,a+n,5)-a<<endl;
/*
1 3 5 5 6 6 7 8 8 9
5 2
6 4
*/