算法-二分法+整数溢出

算法描述

  1. 前提:有已排序数组 A(假设已经做好)
  2. 定义左边界 L、右边界 R,确定搜索范围,循环执行二分查找(3、4两步)
  3. 获取中间索引 M = Floor((L+R) /2)
  4. 中间索引的值 A[M] 与待搜索的值 T 进行比较
    ① A[M] == T 表示找到,返回中间索引
    ② A[M] > T,中间值右侧的其它元素都大于 T,无需比较,中间索引左边去找,M - 1 设置为右边界,重新查找
    ③ A[M] < T,中间值左侧的其它元素都小于 T,无需比较,中间索引右边去找, M + 1 设置为左边界,重新查找
  5. 当 L > R 时,表示没有找到,应结束循环
package com.unit.binarySearch;

import java.util.Arrays;

/**
 *ClassName:BinarySearch
 *Package:PACKAGE_NAME
 *Description:二分法查找   注意:数组需要排序好,且防止整数溢出问题   O(1)
 *@author 程文旭
 @create -08-06 14:51
 */
public class BinarySearch {
    public static void main(String[] args) {
        int[] array = {1, 5, 8, 11, 19, 22, 31, 35, 40, 45, 48, 49, 50};
        int target = 47;
        //数组排序
        Arrays.sort(array);
        int idx = binarySearch(array, target);
        System.out.println(array[idx]);
    }
    //二分法查找,找到返回元素索引,找不到返回-1
    public static int binarySearch(int[] arr,int goal){//goal目标值
        int left = 0,rigth = arr.length-1,middle;
        while (left <= rigth) {
            middle = (left+rigth)/2;
            if (arr[middle] == goal){
                return middle;
            }else if (arr[middle] >goal){
                rigth = middle-1;
            }else {
                left = middle+1;
            }
        }
        return -1;
    }
}

整数溢出

package com.unit.binarySearch;

/*
整数溢出
 */
public class IntegerOverflow {
    public static void main(String[] args) {
        int l = 0;
        int r = Integer.MAX_VALUE - 1;
        //方法二
        int m = (l + r) >>> 1;
        System.out.println(m);
        // 在右侧
        l = m + 1;
        m = (l + r) >>> 1;
        System.out.println(m);
        System.out.println(126 + 63);
        System.out.println((126 + 63)/2);
        System.out.println((126 + 63)>>>1);
    }
    //方法一
    private static void method1() {
        int l = 0;
        int r = Integer.MAX_VALUE - 1;

        int m = l + (r - l) / 2;  //   l/2  +  r/2 ==>  l + (-l/2 + r/2) ==> l + (r-l)/2
        System.out.println(m);

        // 在右侧
        l = m + 1;
        m = l + (r - l) / 2;
        System.out.println(m);

        System.out.println(126 + 63);
    }
}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值