二分查找的原理和实现

一:二分查找函数,写一个函数BinarySeach,在包含size个元素,从小到大排序的int数组a里查找元素P,如果找到,则返回元素下标,如果找不到,则返回-1.复杂度为O(log(n))

int BinarySearch(int a[],int size,int p)  

{

int L=0;//查找区间的左端点
int R=size-1;//查找区间的右端点
while(L<=R)//如果查找区间不为0就继续查找
{
    int mid=L+(R-L)/2;//取查找区间正中元素的下标
    if(p==a[mid])
    return mid;

    else if(p>a[mid])

        L=mid+1;//设置新的查找区间的左端点
    else 
        R=mid-1;//设置新的查找区间的右端点
}
return -1;
}

二:写一个函数LowerBound,在包含size个元素的,从小到大排序的int数组a里查找比给定整数p小的,下标最大的元素。找到则返回其下标,找不到则返回-1

int LowerBound(int a[],int size,int p)
{
int L=0;//查找区间的左端点
int R=size-1;//查找区间的右端点
int lastpos=-1//到目前为止找到的最优解
while(L<=R)//如果查找区间不为0就继续查找
{
    int mid=L+(R-L)/2;//取查找区间正中元素的下标
    if(a[mid]>=p)
        R=mid-1;
    else {
        lastpos=mid;
        L=mid+1;
    }
}
return lastpos;
}

 

 

三:注意

二分查找的区间必须是排好序的,递增或递减的。

为了防止(L+R)过大溢出,通常将 int mid=(L+R)/2;成  int mid=L+(R-L)/2;

 

四:可用于求方程的根

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值