二分查找时间复杂度为O(logn),只适合在有序数数据中查找,其随机访问的特性决定了其底层的数据结构只能为数组。
最简单(无数据重复)的代码实现如下:
int binsearch(int array[],int len, int value)
{
int begin=0,end=len-1;
int mid=begin+(end-begin)>>1;
while(begin<=end){
if(array[mid]>value){
high=mid-1;
}elseif(array[mid]<value){
low=mid+1;
}else{
return mid;
}
return -1;
}
变体一:查找第一个值等于给定值得元素(有重复数据)
int binsearch_1(int array[],int len, int value)
{
int begin=0,end=len-1;
int mid=begin+(end-begin)>>1;
while(begin<=end){
if(array[mid]>value){
high=mid-1;
}elseif(array[mid]<value){
low=mid+1;
}else{
//相等时还不能确定是不是第一个等于给定值的位置,
//在查到第一个元素或者前一个元素不等于给定值,返回
//否则,继续向前查找。
if(mid==0||array[mid-1]!=value)return mid;
high=mid-1;
}
return -1;
}
变体二、查找最后一个值等于给定值的元素
int binsearch_2(int array[],int len, int value)
{
int begin=0,end=len-1;
int mid=begin+(end-begin)>>1;
while(begin<=end){
if(array[mid]>value){
high=mid-1;
}elseif(array[mid]<value){
low=mid+1;
}else{
//相等时还不能确定是不是最后一个等于给定值的位置,
//在查到最后一个元素或者后一个元素不等于给定值,返回
//否则,继续向后查找。
if(mid==len-1||array[mid+1]!=value)return mid;
low=mid+1;
}
return -1;
}
变体三、查找第一个大于等于给定值的元素
int binsearch_3(int array[],int len, int value)
{
int begin=0,end=len-1;
int mid=begin+(end-begin)>>1;
while(begin<=end){
if(array[mid]>=value){
//如果当前值大于等于给定值value,但是它前一个元素小于了给定 值或者当前已经是第一个元素,返回该位置;否则,继续向前查找。
if(mid==0||array[mid-1]<value) return mid;
high=mid-1;
}else{
low=mid+1;
}
return -1;
}
变体四、查找最后一个小于等于给定值的元素
int binsearch_4(int array[],int len, int value)
{
int begin=0,end=len-1;
int mid=begin+(end-begin)>>1;
while(begin<=end){
if(array[mid]>value){
high=mid-1;
}else{
//如果当前值小于等于给定值,那么查找他后面一个值是否已经大于给定值,如果是或者已经是最后一个元素,那么返回该位置,否则,继续向后查找
if(mid==len-1||array[mid+1]>value) return mid;
low=mid+1;
}
return -1;
}