二分查找有两个库函数
lower_bound和upper_bound
iint a[10] = {0,1,2,2,4,4,4,4,5,6};
int k = (lower_bound(a,a+10,3) - a);
//返回大于等于3的第一个数的位置
int f = (upper_bound(a,a+10,4) - a);
//返回大于4的第一个数的位置。
这里我们也可以自己实现二分查找,如下
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
int main(void){
int a[10] = {0,1,2,2,4,4,4,4,5,6};
int l = 1,r = 9;
int find = 4;
while(r - l > 1){
int mid = (l+r)/2;
if(a[mid] >= find)//这里是更新r,然后不断缩短右区间
r = mid;
else
l = mid;
}
printf("%d\n",r);
//这里是返回这个数的最后一个位置7,如果这个序列没有这个数,得到的是刚好比这个数大的第一个位置。
l = 1,r = 9;
while(r - l > 1){
int mid = (l+r)/2;
if(a[mid] <= find)//不断缩减左区间
l = mid;
else
r = mid;
}
//这里得到的是这个数第一次出现的位置4,如果这个序列没有这个数,得到的是刚好比这个数小的最后一个位置。
printf("%d\n",l);
return 0;
}