【二分查找法及其应用】

文章目录

  • 一. 前提
  • 二. 基本思路
  • 三. 代码实现
  • 四. 封装在STL中的二分查找算法
  • 五. 浮点数二分

一. 前提

  • 待查找的序列是有序的;
  • 待查找的 a 采取顺序存储结构

二. 基本思路

设在升序序列 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)

四. 封装在STL中的二分查找算法

  1. lower_bound
ForwoardIterator   lower_bound( ForwoardIterator begin , ForwoardIterator end , const T& num)

lower_bound( begin,end,num):从数组的begin位置到end-1位置二分查找第一个大于或等于num的数字,找到返回该数字的地址,不存在则返回end。通过返回的地址减去起始地址begin,得到找到数字在数组中的下标。

  1. upper_bound
 ForwoardIterator   upper_bound( ForwoardIterator begin , ForwoardIterator end , const T& num)

upper_bound( begin,end,num):从数组的begin位置到end-1位置二分查找第一个大于num的数字,找到返回该数字的地址,不存在则返回end。通过返回的地址减去起始地址begin,得到找到数字在数组中的下标。

  1. binary_search
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;
 }

你可能感兴趣的:(数据结构,数据结构,算法,c++,二分法)