算法第四版1.4.10 修改二分查找算法,使之总是返回和被查找的键匹配的索引最小的元素

本文介绍了如何修改二分查找算法,使其在保持对数时间复杂度的同时,总是返回与搜索键匹配且索引最小的元素。

题目

1.4.10 修改二分查找算法,使之总是返回和被查找的键匹配的索引最小的元素。(且仍能够保证对数级别的运行时间)

1.4.10 Modify binary search so that it always returns the element with the smallest index that matches the search element (and still guarantees logarithmic running time).

代码

package homework1_4;

/**
 * @description: ${description}
 * @create: 2019-03-05
 **/
public class W_1_4_10 {
    //数组a必须是有序的,原始二分查找法
    public static int rank(int key, int[] a) {
        int low = 0;
        int high = a.length - 1;
        while (low <= high) {
            int mid = low + (high - low) / 2;
            if (a[mid] < key) {
                low = mid + 1;
            } else if (a[mid] > key) {
                high = mid - 1;
            } else {
                return mid;
            }
        }
        return -1;
    }

    //1.4.10的做法1 ,一般情况可以满足对数
    public static int rank1(int key, int[] a) {
        int low = 0;
        int high = a.length - 1;
        while (low <= high) {
            int mid = low + (high - low) / 2;
            if (a[mid] < key) {
                low = mid + 1;
            } else if (a[mid] > key) {
                high = mid - 1;
            } else {
                while (a[mid] == a[mid - 1]) {
                    mid--;
                    if (mid < 0) {
                        break;
                    }
                }
                return mid;
            }
        }
        return -1;
    }

    //1.4.10的做法2 高级改进版本
    public static int rank2(int key, int[] a) {
        int low = 0;
        int high = a.length - 1;
        while (low <= high) {
            int mid = low + (high - low) / 2;
            if (a[mid] < key) {
                low = mid + 1;
            } else if (a[mid] > key) {
                high = mid - 1;
            } else if (a[mid - 1] == a[mid] && mid > 0) {
                high = mid;
            } else {
                return mid;
            }
        }
        return -1;
    }

    public static void main(String[] args) {
        int key = 5;
        int[] a = {1, 2, 3, 4, 5, 5, 5, 5, 5, 5, 5, 6, 7, 8, 9, 10, 11};
        System.out.println(rank(key, a));
        System.out.println(rank1(key, a));
        System.out.println(rank2(key, a));
    }
}

结果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值