二分查找函数的简介以及手写代码

函数一
lower_bound(查找数组的初始地址**//左边界**,查找数组末尾地址**//右边界**,要查找的元素值)//可知我们返回的是一个地址,如果再减去一个数组首地址,则为返回了数组的下标。

lower_bound(arr,arr+1+n)-arr.
作用 查找到数组中第一个大于等于查找元素的下标。

特别的(lower_bound(arr,arr+1+n),x)-arr-1.
作用返回最后一个小于x元素的下标。

STL包装函数代码

lower_bound(arr,arr+n,x) - arr.//数组开始,数组末尾,查找元素。减去数组首地址。
lower_bound(arr,arr+1+n),x)-arr-1//找到最后一个小于x的下标

手写代码

int Lower_bound(int x)//找到第一个大于等于x的下标,另外一个类似,我就不写了哈。
{
    int l = 1,r = n;//l为数组开始位置,r为数组结束位置
    while(l <= r)
    {
        int mid = (r+l)/2;
        if(arr[mid] > x)
            r = mid-1;
        else
            l = mid +1;//防止出现当l = 4,r = 5这种死循环。
        if(arr[mid] == x)
        {
            if(arr[1] == x)
                return 1;
            else
            {
                while(arr[mid] == x)
                    mid--;
                return mid+1;
            }
            //因为是查找到第一个大于等于的元素,所以后面呀一个判断。
        }
    }
}

函数二
upper_bound(查找数组的初始地址**//左边界**,查找数组末尾地址**//右边界**,要查找的元素值)//同理,返回的是一个地址,我们减去数组首地址可得查找到的下标。

upper_bound(arr,arr+n,x)-arr。
作用 找到第一个大于x元素的下标。

特别的 upper_bound(arr,arr+n,x)-arr-1。
作用 找到最后一个小于等于x元素的下标。

STL包装函数代码

upper_bound(arr,arr+n,x)-arr;//找到第一个大于x元素的下标
upper_bound(arr,arr+n,x)-arr-1;// 找到最后一个小于等于x元素的下标

这里的手写代码与上面的类似,稍微改动即可。

函数三
binary_search(查找数组的初始地址**//左边界**,查找数组末尾地址**//右边界**,要查找的元素值)。这个函数的返回值不是地址,而是布尔类型的值,意思就是真与假。

binary_search(arr,arr+n,x)
作用 判断数组arr中是否存在x这样一个元素,如果存在,返回1,否返回0.

STL包装函数代码

binary_search(arr,arr+n,x);

手写代码

bool serach(int x)
{
    int l = 1,r = n;//l为数组开始下标,r为数组结束下标
    while(l <= r)
    {
        int mid = (r+l)/2;
        if(arr[mid] > x)
            r = mid-1;
        else
            l = mid+1;
        if(arr[mid] == x)
            return true;
    }
    return false;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值