二分查找算法两种形式:
1、将区间[l,r]分成两块[l,mid]和[mid+1,r](或[l,mid-1]和[mid,r])。
当l=r时即为找到目标,跳出循环
while(l<r)
判定时分三种情况:
设目标为k
(1)k=a[mid] r=mid
(2)k>a[mid] l=mid+1
(3)k<a[mid] r=mid
当l=r时,查找完毕跳出循环,
int Binary_Search(int l,int r,int k)
{
int mid;
while(l<r)
{
mid=(l+r)/2;
if(k<=a[mid])
r=mid;
else
l=mid+1;
}
return l;
}
(若目标k可能不在数列中,则要再次判定)
int Binary_Search(int l,int r,int k)
{
int mid;
while(l<r)
{
mid=(l+r)/2;
if(k<=a[mid])
r=mid;
else
l=mid+1;
}
if(k==a[l])
return l;
else
return -1;
}
2、将区间分成三块,[l,mid-1] mid [mid+1,r]
判断时三种情况:
(1)k=a[mid] 查找完毕,返回mid值
若k!=mid,则mid必然不可能是目标结果的下标
(2)k>a[mid] l=mid+1
(3)k<a[mid] r=mid+1
两种情况完成查找,跳出循环
(1)l>r 未查找到结果
(2)k=a[mid] 查找到结果
int Binary_Search(int l,int r,int k)
{
int mid;
while(l<=r)//=
{
mid=(l+r)/2;
if(k==a[mid])
return mid;
else if(k>a[mid])
l=mid+1;
else
r=mid-1;
}
return -1;
}