面试官:为一个已排好序的数组,写一个二分查找算法

参考代码,以下代码仅供参考,肯定会有更优和更通用的写法

public class A {

    /**
     * @param arrays    已排序好的数组
     * @param fromIndex 从哪里开始计数,一般都是0
     * @param toIndex   数组长度
     * @param key       要找的值
     * @return
     */
    public static int binarySearch(Object[] arrays, int fromIndex, int toIndex,
                                   Object key) {

        //先定义一个数组开始比较开始的范围下标
        int low = fromIndex;
        //再定义一个数组比较结束的范围下标
        int high = toIndex - 1;
        //开始做二分,不断赋值
        while (low <= high) {
            //取中间值
            int mid = (low + high) >>> 1;
            Comparable comparable = (Comparable) arrays[mid];
            //比较中间数值和要找的key值的大小
            int result = comparable.compareTo(key);
            //如果result小于0,则表示中间值比要找的key小,因为是排好序的。所以key值会在mid和high之间
            if (result < 0) {
                //所以重新赋值low,把范围缩小到mid+1到high之间
                low = mid + 1;
                //如果result大于0,则表示中间值比要找的key大,因为是排好序的。所以key值会在low和mid之间
            } else if (result > 0) {
                //所以重新赋值high,把范围缩小到low和mid-1之间
                high = mid - 1;
            } else {
                //否则就是相等,说明找到了
                return mid;
            }
        }
        //循环如果走出来了,那么说明就没找大匹配key的结果,那么就返回负数
        return -(low + 1);
    }
}

测试main函数

  public static void main(String[] args) {
        Integer[] arrays = {1, 3, 6, 7, 9, 10, 16};
        System.out.println(A.binarySearch(arrays, 0, arrays.length, 10));
    }

运行结果
在这里插入图片描述

原创文章 358 获赞 387 访问量 7万+

猜你喜欢

转载自blog.csdn.net/weixin_38106322/article/details/105550835