算法定义
二分查找也称为折半查找,简单定义就是在一个有序的序列中查找元素的位置。
算法要求
- 必须是顺序存储结构
- 必须是一个有序的序列
算法流程
- 假如一个升序的序列中,将表中间位置的值与关键字比较,如果相等,则查找成功。
- 如果关键字比中间位置的值小,则只用查找表前半部分。
- 如果关键字比中间位置的值大,则只用查找表后半部分。
注意:二分查找最关键的问题是边界问题。本篇文章主要介绍查询<=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;
}