二分查找变种

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

比较好的文章

你真的会写二分查找吗

posted @   xiaoxi666  阅读(300)  评论(0编辑  收藏  举报
编辑推荐:
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
阅读排行:
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
TOP
点击右上角即可分享
微信分享提示