基本介绍
二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法,但是要求数组必须有序,时间复杂度为O(log2n)。
基本用法
在有序数列中查找特定元素,思路:将数列中间位置记录的元素与查找元素比较,如果两者相等,则直接返回;否则利用中间位置记录将数列分成前、后两个子表,如果中间位置记录的元素大于查找元素,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。
int binarySearch(int l,int r,int x)//a[l...r]中是否存在x
{
if(l>r)
return -1;
int mid=(l+r)/2;
if(a[mid]==x)
return mid;
if(a[mid]<x)
return binarySearch(mid+1,r,x);
else
return binarySearch(l,mid-1,x);
}
进阶用法
查找大于x的最小的数
int larger(int x)//a中大于x的最小的数的下标
{
int l=0,r=n;
int mid;
while(l<r)
{
mid=(l+r)/2;
if(a[mid]>x)
r=mid;
else
l=mid+1;
}
return l;
}
查找小于x的最大的数
int smaller(int x)//a中小于x的最大的数的下标
{
int l=-1,r=n-1;
int mid;
while(l<r)
{
mid=(l+r+1)/2;
if(a[mid]<x)
l=mid;
else
r=mid-1;
}
return l;
}