《算法导论》习题2.3-5 二分搜索 Binary Search

地球人都知道“二分查找”,方法也非常简单,但是你能不能在10分钟内写出一个没有bug的程序呢?

知易行难,自己动手写一下试一试吧。

public class BinarySearch {
    public static int search(int [] A,int target,int a, int b)
    {   
        int  middle = (a+b)/2;
        if(a>b)
            return -1;
        else if (A[middle]==target)
            return middle;
        else if (A[middle]< target)
            return search(A,target,middle+1,b);
        else 
            return search(A,target,a,middle-1);
    }
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        int A [] = {2,4,6,8,10};
        System.out.println( BinarySearch.search(A,1 , 0, A.length-1)  );
        System.out.println( BinarySearch.search(A,2 , 0, A.length-1)  );
        System.out.println( BinarySearch.search(A,3 , 0, A.length-1)  );
        System.out.println( BinarySearch.search(A,4 , 0, A.length-1)  );
        System.out.println( BinarySearch.search(A,5 , 0, A.length-1)  );
        System.out.println( BinarySearch.search(A,6 , 0, A.length-1)  );
        System.out.println( BinarySearch.search(A,7 , 0, A.length-1)  );
        System.out.println( BinarySearch.search(A,8 , 0, A.length-1)  );
        System.out.println( BinarySearch.search(A,9 , 0, A.length-1)  );
        System.out.println( BinarySearch.search(A,10 , 0, A.length-1) );
        System.out.println( BinarySearch.search(A,11 , 0, A.length-1) );
    }
}

上面的代码看似是没有任何问题了,但是呢,其实还是有一个很微妙的bug,这个bug发生在:

int  middle = (a+b)/2;

这一行。想一下,如果a+b超出了Int型的最大值了呢???
所以呢,修正这个bug应该这样:
public class BinarySearch {
    public static int search(int [] A,int target,int a, int b)
    {   
        int  middle = a+(b-a)/2;
        if(a>b)
            return -1;
        else if (A[middle]==target)
            return middle;
        else if (A[middle]< target)
            return search(A,target,middle+1,b);
        else 
            return search(A,target,a,middle-1);
    }
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        int A [] = {2,4,6,8,10};
        System.out.println( BinarySearch.search(A,1 , 0, A.length-1)  );
        System.out.println( BinarySearch.search(A,2 , 0, A.length-1)  );
        System.out.println( BinarySearch.search(A,3 , 0, A.length-1)  );
        System.out.println( BinarySearch.search(A,4 , 0, A.length-1)  );
        System.out.println( BinarySearch.search(A,5 , 0, A.length-1)  );
        System.out.println( BinarySearch.search(A,6 , 0, A.length-1)  );
        System.out.println( BinarySearch.search(A,7 , 0, A.length-1)  );
        System.out.println( BinarySearch.search(A,8 , 0, A.length-1)  );
        System.out.println( BinarySearch.search(A,9 , 0, A.length-1)  );
        System.out.println( BinarySearch.search(A,10 , 0, A.length-1) );
        System.out.println( BinarySearch.search(A,11 , 0, A.length-1) );
    }
}

查找一个元素是否存在,自然分为“存在”和“不存在”两种情况。在思考二分查找的时候,先思考“存在”的情况,设计算法,然后再去考虑“不存在”的情况。

如果同时思考“存在”和“不存在”两种情况,那么很容易被绕晕。

转载于:https://www.cnblogs.com/wzm-xu/p/4079849.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值