二分查找算法的细节

这是我自己写的二分查找(比较繁杂多余):

public class Binarysearch {
    public static void main(String[] args) {
        int[] arr = {3, 14, 22, 32, 45, 52, 63, 68, 79, 82};
        int temp = Binarysearch(arr, 53);
        System.out.println(temp);


    }

    public static int Binarysearch(int[] arr, int target) {
        int low = 0, higth = arr.length - 1;
        while (low < higth) {
            int mid = (low + higth) / 2;
            if (arr[low] == target) {
                return low;
            }
            if (arr[higth] == target) {
                return higth;
            }
            if (arr[mid] == target) {
                return mid;
            }
            if (arr[mid] > target) {
                higth = mid - 1;
            }
            if (arr[mid] < target) {
                low = mid + 1;
            }
        }
        return -1;
    }
}

改进之后:

public class Binarysearch1 {
    public static void main(String[] args) {

        int[] arr = {3, 14, 22, 32, 45, 52, 63, 68, 79, 82};
        int temp = Binarysearch(arr, 52);
        System.out.println(temp);
    }

    public static int Binarysearch(int[] arr, int target) {
        int low = 0, higth = arr.length - 1;
        while (low <= higth) {
            //关键的在这,<=的话会多一次判断,也就是会把目的值=low,higth的情况包含进去

            int mid = (low + higth) >>> 1;
            //>>>1 (无符号右移)表示为:将其转换为二进制数,求出补码,然后整体向右移一位 (当然这是正数的情况)
           //比如(0+7)>>>1等于3
7的原码为 0000 0111,补码为其本身0000 0111,向右移一位,变成了0000 0011=3
            //为什么用这个呢,因为原本的(i+J)/2,如果是大批量的数据 那计算到后面       (i=mid+1)那i+j的值会非常大
            //可能会导致数据溢出(int的范围:-2的31次方-1 到 +2的31次方-1)
溢出之后的数据会变成负数

            if (target < arr[mid]) {
//此处的< 与下方的< 其实这样写,更符合我们人的思维方式,一看就知道目标值在mid的左侧还是右侧
                higth = mid - 1;
            } else if (arr[mid] < target) {
                low = mid + 1;
            } else {
                return mid;
            }
        }
        return -1;
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值