基本的二分查找

来源:互联网 发布:常见毒药 知乎 编辑:程序博客网 时间:2024/05/17 22:18

二分查找有两个库函数

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;}