二分查找-以及变体

本文详细介绍了二分查找算法,包括其时间复杂度和适用场景,并提供了四个变体的代码实现:查找第一个等于给定值的元素、查找最后一个等于给定值的元素、查找第一个大于等于给定值的元素以及查找最后一个小于等于给定值的元素。每个变体都考虑了数据重复的情况并优化了查找策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

二分查找时间复杂度为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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值