• 二分查找变种


    该算法有很多版本,这里给出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);    // 参照官方文档自定义值
    }
    

    比较好的文章

    你真的会写二分查找吗

  • 相关阅读:
    推荐:负采样
    JNDI学习总结(一)——JNDI数据源的配置
    前端性能优化
    java中的引用类型概念
    java中的各种数据类型在内存中存储的方式
    POI导出EXCEL经典实现
    synchronized 与 Lock 的那点事
    黑马程序员_Map<K,V> 映射关系 Map.Entry
    Java ConcurrentModificationException异常问题
    表 (list)
  • 原文地址:https://www.cnblogs.com/xiaoxi666/p/9715129.html
Copyright © 2020-2023  润新知