【算法学习笔记】22.算法设计初步 二分查找 上下界判断

二分查找的两种写法,递归和普通循环~ 大部分情况下都用普通的循环,因为递归法费空间。

/*
 时间复杂度:
 1.最坏情况 查找最后一个元素(或者第一个元素) Master定理 T(n)=T(n/2)+O(1) 这个O(1)是判断 所以 T(n)=O(logn) 
                            a=1 b=2 所以要比较的是 O(1)和 n^(log2 1)  
 2.最好情况 查找中间元素  O(1)
 空间复杂度:
 S(n)=n
 */


int biFind(int* A,int len,int item,int cur){
    //example: len 4: 2 4 5 3 middle = 1 (1.5)
    //example: len 5: 2 5 6 4 1 middle = 2
    int middle = (len-1)/2;
    if (A[middle]==item)
        return cur;
    if (len==1)
        return -1;
    if(A[middle]>item)
        return biFind(A, middle, item,cur);
    return biFind(A+middle+1, len-middle-1, item,cur+middle+1);
}
int biFind_1(int* A,int x,int y,int item){
    //划分
    int m = x+(y-x)/2;
    while (x<y) {//说明还有要搜索的必要
        if(A[m]==item) return m;//找到了 返回
        else if(item<A[m]) y=m;//item在左边 所以右端更新为m
        else x=m+1;//item在右边 所以左边更新为m+1
        m = x+(y-x)/2;//更新middle
    }
    return -1;//说明没有找到
}


//lower_bound的定义 = 若A中有item 则返回A中item第一次出现的位置
//若没有item 则返回i:这个i可以是的 把A[i],A[i+1]...后遗 把item插入到A[i]可以保证A有序
int lower_bound(int* A,int x,int y,int item){
    //划分
    int m ;
    while (x<y) {//说明还有要搜索的必要
        m = x+(y-x)/2;//更新middle
        if(A[m]>=item) y=m;//找到了但是左面有可能还有 或者 中间元素大于item
        else x=m+1;//item在右边 所以左边更新为m+1
    }
    //如果一直没找到 此时x==y 且是正中间
    return x;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值