一、基本的二分查找
//查找b的下标(任意一个),n为元素的个数
int Bi_Search(int a[],int n,int b)
{
if(n==0)
return -1;
int low = 0;
int high = n-1;
int last = -1; //用last记录下标
while (low<=high)
{
int mid = low +(high-low)/2; //相比于mid=(low+high)/2,此表达式防止溢出
if (a[mid]==b)
{
last = mid;
return last;
}
else if(a[mid]>b)
high = mid -1;
else
low = mid +1;
}
return -1;
}
//返回等于b的第一个数
int Bi_Search(int a[],int n,int b)
{
if(n==0)
return -1;
int low = 0;
int high = n-1;
int last = -1; //用last记录上一次满足条件的下标
while (low<=high)
{
int mid = low +(high-low)/2;
if (a[mid]==b)
{
last = mid;
high = mid -1;
}
else if(a[mid]>b)
high = mid -1;
else
low = mid +1;
}
return last;
}
//返回等于b的最后一个数
int Bi_Search(int a[],int n,int b)
{
if(n==0)
return -1;
int low = 0;
int high = n-1;
int last = -1; //用last记录上一次满足条件的下标
while (low<=high)
{
int mid = low +(high-low)/2;
if (a[mid]==b)
{
last = mid;
low = mid +1;
}
else if(a[mid]>b)
high = mid -1;
else
low = mid +1;
}
return last;
}
//返回大于b的第一个数
int Bi_Search1(int a[],int n,int b)
{
if(n<=0)
return -1;
int last = -1;
int low = 0;
int high = n-1;
while (low<=high)
{
int mid = low +(high - low)/2;
if(a[mid]>b) //如果返回大于等于b的第一个数,此条件改为为a[mid]>=b
{
last = mid;
high = mid -1;
}
else
{
low =mid +1;
}
}
return last;
}
//返回小于b的最后一个数
int Bi_Search1(int a[],int n,int b)
{
if(n<=0)
return -1;
int last = -1;
int low = 0;
int high = n-1;
while (low<=high)
{
int mid = low +(high - low)/2;
if(a[mid]<b)
{
last=mid;
low =mid +1;
}
else
{
high = mid -1;
}
}
return last;
}