zoukankan      html  css  js  c++  java
  • Java二分查找

    二分查找源码:

    public class jh_29_数组查找_二分查找 {
    /**
    * binarySearch搜索指定值的指定值数组。
    * 前提:列表要排好序(升序)
    * arr:要搜索的数组
    * num:要搜索的值
    * 如果包含再数组中,则返回索引,否则,返回(-(插入点)-1)
    * @param args
    */
    public static void main(String[] args) {
    int[] arr = {4, 6, 7, 11, 22, 23, 44, 55};
    int numIndex = binarySearch(arr, 10);
    System.out.println(numIndex);
    }

    public static int binarySearch(int[] arr, int num) {
    int low = 0; //索引位为0
    int high = arr.length - 1; //索引位为数组的最后一位
    // 终止条件为:low=hight+1 写成区间是[hight+1,hight]
    // 当low>hight时,说明数组查完了,没找到
    while (low <= high) {
    // 获取中间索引
    // 计算 mid 时需要技巧防止溢出,建议写成: mid = left + (right - left) / 2,本文暂时忽略这个问题。
    int mid = (low + high) / 2;
    // 获取中间的值
    int midVal = arr[mid];
    // 分析二分查找的一个技巧是:不要出现 else,而是把所有情况用 else if 写清楚,这样可以清楚地展现所有细节。
    if (midVal < num) {
    low = mid + 1;
    } else if (midVal > num) {
    high = mid - 1;
    } else if (midVal == num) {
    return mid;
    }
    }
    return -(low + 1);
    }
    }

    最后总结

    先来梳理一下这些细节差异的因果逻辑:

    
    

    第一个,最基本的二分查找算法:

    因为我们初始化 high = arr.length - 1
    所以决定了我们的「搜索区间」是 [low, high]
    所以决定了 while (low<= high)
    同时也决定了 low = mid+1 和 high = mid-1
    
    因为我们只需找到一个 num 的索引即可
    所以当 arr[mid] == num 时可以立即返回
    
    

    通过本文,你学会了:

    1. 分析二分查找代码时,不要出现 else,全部展开成 else if 方便理解。

    2. 注意「搜索区间」和 while 的终止条件,如果存在漏掉的元素,记得在最后检查。

    3. 如需要搜索左右边界,只要在 arr[mid] == num时做修改即可。搜索右侧时需要减一。

    参考博客:https://www.cnblogs.com/kyoner/p/11080078.html

  • 相关阅读:
    [kuangbin带你飞]专题十二 基础DP1 E
    hdu 1203 I NEED A OFFER! (01背包)
    hdu 2602 Bone Collector (01背包)
    hdu 4513 吉哥系列故事——完美队形II (manacher)
    hdu 2203 亲和串 (KMP)
    hdu 1686 Oulipo (KMP)
    hdu 1251 统计难题 (字典树)
    hdu 2846 Repository (字典树)
    hdu 1711 Number Sequence (KMP)
    poj 3461 Oulipo(KMP)
  • 原文地址:https://www.cnblogs.com/LEPENGYANG/p/14974892.html
Copyright © 2011-2022 走看看