二分查找和lower_bound & upper_bound

来源:互联网 发布:常用统计分析软件 编辑:程序博客网 时间:2024/05/16 15:43

问题:


对于事先排好序的非递减数列,查找其中值为val的下标,如果val不存在则返回-1

二分查找,数学中有利用二分法求近似值的方法也是这个原理

数列是非递减的,只需步步尝试逼近所需要的值

#include<bits/stdc++.h>using namespace std;int BinarySearch(const int A[],int val,int N){    int left,right,mid;    left = 0,right = N-1;    while (left <= right)    {        mid = (left+right)>>1;        if (A[mid] < val)            left = mid + 1;        else if (A[mid] > val)            right = mid - 1;        else return mid;    }    return -1;}int main(){    int A[8] = {-5,2,4,7,9,22,122,250};    cout<<BinarySearch(A,7,8)<<endl;    cout<<BinarySearch(A,27,8)<<endl;    return 0;}

lower_bound(first,last,val)返回非递减数列中[first,last),左开右闭区间内第一个大于等于val的位置

用法:int p = lower_bound(a,a+n,x) - a;

upper_bound(first,last,val)返回非递减数列中[first,last),左开右闭区间内第一个大于val的位置

用法:int p = upper_bound(a,a+n,x) - a;

若找不到则返回最后last的位置

#include<bits/stdc++.h>using namespace std;int main(){    int a[8] = {-5,2,4,7,9,22,122,250};    int p1 = lower_bound(a,a+8,7) - a;//返回3(可取等)    int p2 = upper_bound(a,a+8,7) - a;//返回4    cout<<"p1 = "<<p1<<endl;    cout<<"p2 = "<<p2<<endl;    int p3 = lower_bound(a,a+8,300) - a;//返回8(未找到)    cout<<"p3 = "<<p3<<endl;    return 0;}


0 0
原创粉丝点击