设在升序序列 a [ low…high ] 查找的 k ,
首先找中间值
mid= a [ ( low+high )/2 ] ;
然后比较 k
和 a [ mid ] , 分成三个情况:
(1)k == a[ mid ] , 直接返回 a [ mid ] ;
(2)k < a [ mid ] , 新的查找区域变为左子表 a [ low , mid-1 ] ;
(3)k > a [ mid ] , 新的查找区域变为右子表 a [ mid+1 , high ] ;
下一次查找根据 新的查找区间
进行查找。
//二分查找法
int BinSearch(int a[],int low,int high,int k)
{
if(low<=high){ //当前区间存在元素
int mid=(low+high)/2;
if(a[mid]==k)
return mid; //找到后返回其下标
if(a[mid]<k)
return BinSearch(int a[],int low,int mid-1,int k);
if(a[mid]>k)
return BinSearch(int a[],int mid+1,int high,int k);
}else{
return -1; //区间不存在元素,返回 -1
}
}
可见二分查找的时间重要花费在元素比较上,其时间复杂度为O( log 2 n \log_{2}n log2n)
ForwoardIterator lower_bound( ForwoardIterator begin , ForwoardIterator end , const T& num)
lower_bound( begin,end,num):从数组的begin位置到end-1位置二分查找第一个大于或等于num的数字,找到返回该数字的地址,不存在则返回end。通过返回的地址减去起始地址begin,得到找到数字在数组中的下标。
ForwoardIterator upper_bound( ForwoardIterator begin , ForwoardIterator end , const T& num)
upper_bound( begin,end,num):从数组的begin位置到end-1位置二分查找第一个大于num的数字,找到返回该数字的地址,不存在则返回end。通过返回的地址减去起始地址begin,得到找到数字在数组中的下标。
bool binary_bound( ForwoardIterator begin , ForwoardIterator end , const T& num)
区间中存在要查找的值,返回 true ;否则, false
1.求n的平方根,保留6位小数
#include
using namespace std;
int main()
{
double n;
cin>>n;
double l=0,r=n;
while(r-l>=1e-8){ //负的,别忘!!!
double mid=(l+r)/2;
if(mid*mid>n) r=mid;
else l=mid;
}
printf("%lf",l);
return 0;
}