二分

193 阅读1分钟

算法定义

二分查找也称为折半查找,简单定义就是在一个有序的序列中查找元素的位置。

算法要求

  1. 必须是顺序存储结构
  2. 必须是一个有序的序列

算法流程

  1. 假如一个升序的序列中,将表中间位置的值与关键字比较,如果相等,则查找成功。
  2. 如果关键字比中间位置的值小,则只用查找表前半部分。
  3. 如果关键字比中间位置的值大,则只用查找表后半部分。

注意:二分查找最关键的问题是边界问题。本篇文章主要介绍查询<=key最后一个位置,以及查询>=key 第一个位置。

样例说明

  • 查询<=key的最后一个位置 当key=3 ,1 1 3 (3) 4;当key=2,1 (1) 3 3 4
  • 查询>=key的第一个位置 当key=3 ,1 1 (3) 3 4;当key=2,1 1 (3) 3 4

代码实现

int find_low(int a[],int l,int r,int key)//查询>=key的第一个位置。 
{
	while(l<r)
	{
		int mid=(l+r)>>1;
		if(key<=a[mid]) r=mid;
		else l=mid+1;
	}
	return l;	 
}
int find_high(int a[],int l,int r,int key)//查询<=key的最后一个位置 
{
	while(l<r)
	{
		//这里+1的目的是为了当l与r相差1的时候取r不取l 
		//如果取l位置,但是a[r]=mid,这时会执行l=mid,就会陷入死循环 
		int mid=(l+r+1)>>1;
		if(key>=a[mid]) l=mid;
		else r=mid-1; 
	}
	return l;	 
}