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

    该算法有很多版本,这里给出java中实现比较好的一种方式。其中,>>>为无符号右移。

    二分查找第一个值为obj的元素

    /**
     * 二分查找第一个值为obj的元素
     * @param array
     * @param obj
     * @return 若数组为空,返回-1; 若查找到,则返回其索引; 若未查找到,返回负值(可能为-1)
     */
    public static int binarySearchFirstEqual (int[] array, int obj) {
        if (array == null || array.length == 0) {
            return -1;
        }
        int left = 0;
        int right = array.length - 1;
        while (left < right) {
            int mid = left + ((right - left) >>> 1);
            if (array[mid] < obj) {
                left = mid + 1;
            } else {
                right = mid;
            }
        }
        if (array[left] == obj) {
            return left;
        }
        return -(left + 1);    // 参照官方文档自定义值
    }
    

    二分查找最后一个值为obj的元素

    /**
     * 二分查找最后一个值为obj的元素
     * @param array
     * @param obj
     * @return 若数组为空,返回-1; 若查找到,则返回其索引; 若未查找到,返回负值(可能为-1)
     */
    public static int binarySearchLastEqual (int[] array, int obj) {
        if (array == null || array.length == 0) {
            return -1;
        }
        int left = 0;
        int right = array.length - 1;
        while (left <= right) {
            int mid = left + ((right - left) >>> 1);
            if (array[mid] <= obj) {
                left = mid + 1;
            } else {
                right = mid - 1;
            }
        }
        if (right >= 0 && array[right] == obj) {
            return right;
        }
        return -(right + 1);    // 参照官方文档自定义值
    }
    

    比较好的文章

    你真的会写二分查找吗

  • 相关阅读:
    [Effective JavaScript 笔记]第54条:将undefined看做“没有值”
    [Effective JavaScript 笔记]第53条:保持一致的约定
    UDP打洞原理介绍
    Uboot启动分析之Start.S
    MMU
    linux_shell
    SSH2配置
    线程同步
    C#线程基础
    客户端服务器通讯常用的一种方法——Marshal类
  • 原文地址:https://www.cnblogs.com/xiaoxi666/p/9715129.html
Copyright © 2011-2022 走看看