二分查找

算法思想

二分查找是基于一个升序数组实现的我们在数组的两端分别定义两个指针指向数组的第一个索引和最后一个索引,根据根据两边的索引来算出中间索引((左索引+右索引)/2 )的进而得到中间索引的数组元素将其与目标值进行比较,如果目标值小于中间索引的数组元素值我们将右指针移到中间索引的减一的位置,如果目标值大于中间索引的数组元素值我们将左指针移到中间索引加一的位置,然后循环进行上述过程直到两个指针指向同一个位置

代码实现一

    public static int search(int[] array,int key) {
        int i=0,j=array.length-1;//定义两个指向左侧索引和右侧索引的指针
        int middle;
        while (i<=j){
            middle=(i+j)/2;
            if(key<array[middle]){//目标值在中间索引元素的左边
                j=middle-1;//将右边的指针向左移动
            }else if(key>array[middle]){//目标值在中间索引元素的右边
                i=middle+1;//将左边的指针向右移动
            }else {//找到了返回索引位置
                return middle;
            }
        }
        //没找到返回-1
        return -1;
    }

代码改进

 middle=(i+j)/2;当i和j足够大时我们用普通的除法将会出现middle为负数的情况

middle=(i+j)/2>>>1这样运算便可以避免出现负数的情况

除了上述的代码实现还有另一种代码实现

代码实现二

这种实现代码我们将右侧指针指向的元素不参与比较

    public static int search(int[] array,int key) {
        int i=0,j=array.length;//定义两个指向左侧索引和右侧索引的指针,右侧指针的指向不参与比较 改动1
        int middle;
        while (i<j){//改动2
            middle=(i+j)/2;
            if(key<array[middle]){//目标值在中间索引元素的左边
                j=middle;//将右边的指针向左移动 改动3
            }else if(key>array[middle]){//目标值在中间索引元素的右边
                i=middle+1;//将左边的指针向右移动
            }else {//找到了返回索引位置
                return middle;
            }
        }
        //没找到返回-1
        return -1;
    }

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值