二分查找变种

该算法有很多版本,这里给出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 @ 2018-09-27 19:43  xiaoxi666  阅读(299)  评论(0编辑  收藏  举报
TOP