二分查找
条件:数组 && 有序
对于二分查找某一个值,在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;
else
low=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;
else
high=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;
}