二分查找边界值

来源:互联网 发布:天涯明月刀包子脸数据 编辑:程序博客网 时间:2024/06/05 04:10

二分查找

条件:数组 && 有序

对于二分查找某一个值,在logN 复杂度完成。

对于二分查找边界值,要注意 low,high,mid的取值

// 二分查找上下界,小标从0开始/* 例如对于数组 {1,3,5,7,12,56,78},找小于7的第一个值,或大于7的第一个值 */// 查找大于key的第一个值int binary_search_upperbound(int a[],int n,int key){if(key>=a[n-1]) return -1;//如果是大于等于key的第一个值,则此处改为>int low,high,mid;low=0;high=n-1;mid=(low+high)/2;while(low<high){if(key<a[mid])//如果是大于等于key的第一个值,则此处改为<=high=mid;elselow=mid+1;mid=(low+high)/2;}cout<<(mid==high? "YES":"No")<<endl;// mid是等于high的return a[mid];}// 查找小于key的第一个值int binary_search_lowerbound(int a[],int n,int key){if(key<=a[0]) return -1;//如果是大于等于key的第一个值,则此处改为<int low,high,mid;low=0;high=n-1;mid=(low+high+1)/2;while(low<high){if(key>a[mid])//如果是大于等于key的第一个值,则此处改为>=low=mid;elsehigh=mid-1;mid=(low+high+1)/2; //如果不加1,会有死循环}cout<<(mid==low? "YES":"No")<<endl;return a[mid];}void main(){int a[]={1,3,5,7,9,12,43,56,67,78};cout<<binary_search_upperbound(a,10,3)<<endl;cout<<binary_search_lowerbound(a,10,56)<<endl;}