二分查找法

https://blog.csdn.net/zhouyelihua/article/details/46665931
还要练下变形题啦!
https://www.cnblogs.com/coser/archive/2011/04/11/2013013.html

在百度百科里面是这样描述的:“二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。

该算法有两个名字(二分查找、折半查找)、优点三个(比较次数少、查找速度快、平均性能好)、缺点两个(待查找表为有序表、插入删除困难)。

    public static void main(String[] args) {
        int[] arr ={0,1,2};
        int res =binarySearch(arr,3,0);
        System.out.println(res);    
    } 

    //正确的二分查找法
    public static int binarySearch(int a[], int n, int key)
    {
        int low = 0;
        int high = n - 1;
        int mid;
        //while(low < high)        //key可能刚好在low与high相等的地方
        while(low <= high)        //key可能刚好在low与high相等的地方
        {
            mid = (low + high)/2;
            if(key == a[mid])
                return mid;

            if(key < a[mid])
                high = mid - 1;
               //high = mid; 可能死循环
            else
                low = mid + 1;
               //low = mid; 可能死循环
        }

        return -1;
    }

注意事项 一:mid溢出

针对上文代码中

mid=(left+right)/2;

这一句代码有两个注意事项:

1.计算机方式有乘以2n或者是除以2n都可以利用移位代替。所以上述代码可以改为:

mid=(left+right)>>1;

这里写图片描述

注意事项 二:常数步的前进

这个错误在编程珠玑中也有提到的,但是自己还是经常放错误。
还是原来的那段代码很多人容易写成

left=mid+1     ==》   left=mid;
right=mid-1    ==》   right=mid;

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值