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);    // 参照官方文档自定义值
    }
    

    比较好的文章

    你真的会写二分查找吗

  • 相关阅读:
    Oracle中Lpad函数和Rpad函数的用法
    SQL中on条件与where条件的区别
    安装sqlServer
    springboot注解加深
    springcloud父项工程pom
    雪花算法
    docker 创建mysql容器
    docker入门
    restful接口规范(安全与幂等)
    mysql
  • 原文地址:https://www.cnblogs.com/xiaoxi666/p/9715129.html
Copyright © 2011-2022 走看看