二分查找

/**
 * @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);
    }
}
posted @ 2019-12-23 15:53  四叶草的诗雨  阅读(282)  评论(0编辑  收藏  举报