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
*/
posted @ 2020-02-07 15:27  DuJunlong  阅读(2)  评论(0编辑  收藏  举报  来源