从二分查找法看循环不变量-JAVA

上代码,注释里写了具体的含义

 public static int binarySearchRN(Comparable[] arr, int n, Comparable target){

        //int l = 0, r = n - 1;//在数组中从[l...r]的范围内寻找target
        //循环不变量l 与 r 就代表了需要查找的这个范围的左右边界,而选择取不同的值,对于这个区间来说就是开区间与闭区间的区别,在修改它们的同时,也需要在循环中同步这一定义。这也就是循环不变量的意义
        //int l = 0, r = n;
        //int l = -1, r = n -1;
        int l = -1, r = n;//在数组中从[l...r)的范围内寻找target
        //while (l <= r ){ //当l == r时,区间[l...r]依然有效
        while (l < r) {
            int mid = (l + r ) / 2;//为了防止整型溢出的问题,可以修改为l + (r - l) / 2
            if(arr[mid].compareTo(target) == 0) return mid;
            if(target.compareTo(arr[mid]) > 0)
 				//	l = mid + 1;	//	在[mid + 1 ... r]中寻找目标    
                l = mid;    //	在(mid ... r)中寻找目标
            else
                //r = mid - 1;    //在[l ... mid - 1]中寻找目标
                r = mid;	//在(l ... mid)中寻找目标
        }

        return -1;
    }

//测试
public static void main(String[] args) {
        int n = 1000000;
        Integer[] data = MyUtil.generateOrderArray(n);
        long startTime = System.currentTimeMillis();
        for (int i = 0; i < n; i ++)
            if(i != BinarySearch.binarySearchRN(data, data.length, i))
                throw new IllegalArgumentException("error");
        long endTime = System.currentTimeMillis();
        System.out.println("time cost: " + (endTime - startTime) + "ms");
    }

明确每一个变量的含义,就能明确循环不变量

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值