二分查找算法,经典剖析,你还觉得查找算法难?

查找

线性查找

这个查找算法就不用讲述了,小编相信很多小伙伴都懂,线性查找适用于无序的数查找,但这种算法有些暴力,需要遍历数组每个下标的元素.

二分查找

分析

这是非常经典的查找算法,其规定数组的元素一定是有序的,因为我们要根据元素的大小进行一个折半,从而达到缩小遍历范围的目的.

比如上图,如果小编要找67,就可以先找到中间位置第三位,为5(从0开始),然后判断67是否比5大,如果比5大说明一定在5右边,然后又开始在5右边折半,找到89,发现该数字比67大,然后在89左边折半(此时注意是以67为起点),便找到了67.

代码实现

public class FoldSearch {

    public static int foldSearch(int value,int[] a){

        int left=0,right=a.length-1;

        if (value<a[0] || value>a[right])
            return -1;
        int middle;
        while (true){
            middle=(left+right)/2;
            if (a[middle]<value){
                left=middle+1;
            }else if (a[middle]>value)
                right=middle-1;
            if (a[middle]==value)
                return middle;
            if (left==right)
                return -1;
        }

    }

    public static void main(String[] args) {
        int[] a=new int[]{1,3,5,7,8,9,10,15};
        System.out.println(FoldSearch.foldSearch(11, a));
    }
}

优化: 二分查找主要的思想在于计算middle,然后不断改变middle以减少遍历达到高效率.但你会发现,如果你寻找的某个值刚好在某个极限值,其实二分查找就没有意义,因为有可能只通过遍历一个元素就可以找到,效率反而比二分查找要高.
所以这里我们可以优化一下,因为middle的分母是写的,所以我们每次都是以中间作为middle,对于有些在边缘的查找值确实是鸡肋,那就用一个概率算法,大概计算出查找值在哪里就可以了.
直接将middle的分母变为(value-a[left])/(a[right]-a[left]) ,该式子就是在近似计算value的值在哪个位置.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值