您的位置:首页 > 其它

基本的二分查找

2017-08-09 23:32 169 查看
二分查找有两个库函数

lower_bound和upper_bound


int a[10] = {0,1,2,2,4,4,4,4,5,6};

int k = (int)(lower_bound(a+1,a+1+9,4) - (a+1));
//返回的是第一次出现4的前一个位置结果是3
int f = (int)(upper_bound(a+1,a+1+9,4) - (a+1));
//返回的是最后一次出现4的位置。


这里我是用从1开始的,从0开始可以类比。

这里我们也可以自己实现二分查找,如下

#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: