二分查找

Posted name-lizonglin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二分查找相关的知识,希望对你有一定的参考价值。

/**
 * @Description:?【】?->二分查找
 * @Author: Mr.li
 * @Date: 2019/11/29
 */
public class BinarySearch {
    /**
     * @Description:?【】?->二分查找递归查询
     * @Param: arrays   要查找的有序数组
     * @Param: low      头指针初始位置
     * @Param: high     尾指针初始位置
     * @Param: key      要查找的数
     * @Return: int
     * @Author: Mr.li
     * @Date: 2019/11/29
     */
    public static int recursiveBinarySearch(int[] arrays, int low, int high, int key) {
        //计算中间索引值
        int mid = low + (high - low) / 2;
        //判断查找的数是否在数组中
        //如果此处不加判断,则有可能报 java.lang.StackOverflowError栈内存溢出
        if (low > high || key > arrays[high] || key < arrays[low]) {
            return -1;
        }
        if (arrays[mid] > key) {
            //mid所对应的值比Key大,key应该在左边区域
            return recursiveBinarySearch(arrays, low, mid - 1, key);
        } else if (arrays[mid] < key) {
            //mid所对应的值比key小,key应该在右边区域
            return recursiveBinarySearch(arrays, mid + 1, high, key);
        } else {
            return mid;
        }
    }
    /**
     * 二分查找非递归数组
     * @Param: arrays  要查找的有序数组
     * @Param: key     要查找到的值
     * @Description:?【】?->中建索引值计算方式有以下两种<br>
     * int mid = low + (high - low) / 2
     * //防止溢出
     * int mid = (high + low) >>> 1
     * 说明: 要查找数组为偶数个数时,需向下取整
     * @Return: int
     * @Author: Mr.li
     * @Date: 2019/11/29
     */
    public static int unRecursiveBinarySearch(int[] arrays, int key) {
        //头指针初始位置
        int low = 0;
        //尾指针初始位置
        int high = arrays.length - 1;
        //判断查找的数是否在数组中,如果此处不加判断,则有可能报 java.lang.StackOverflowError栈内存溢出
        if (low > high || key > arrays[high] || key < arrays[low]) {
            return -1;
        }
        //确保不会出现重复查找,越界
        while (low <= high) {
            //计算出中间索引值,防止溢出
            int mid = (high + low) >>> 1;
            if (key == arrays[mid]) {
                return mid;
            } else if (key < arrays[mid]) {
                high = mid - 1;  //mid所对应的值比key大,key应该在左边区域
            } else {
                low = mid + 1; //mid 所对应的值比key小,key应该在右边区域
            }
        }
        //若没有,则返回 -1
        return -1;
    }
    /**
     * 使用二分法查找算法找出arrays数组中《《8》》的位置
     * @Author: Mr.li
     * @Date: 2019/11/29
     */
    public static void main(String[] args) {
        int[] arrays = new int[]{2, 8, 12, 18, 20, 25, 30, 37, 41, 49, 61};
        int key = 8;
        int low = 0;
        int high = arrays.length - 1;
        //非递归查找
        int i = unRecursiveBinarySearch(arrays, key);
        System.out.println("非递归查找,索引值为:" + i);
        //递归查找
        int recursiveInt = recursiveBinarySearch(arrays, low, high, key);
        System.out.println("递归查找,索引值为:" + recursiveInt);
    }
}

以上是关于二分查找的主要内容,如果未能解决你的问题,请参考以下文章

java 二分查找法

代码题(12)— 二分查找

二分查找代码

PHP实现二分查找算法(代码详解)

「算法笔记」一文摸秃二分查找

C语言二分查找