Java二分法查找(递归、循环实现)

Java二分法查找(递归、循环实现)

public class BinarySearch {
    public static void main(String[] args) {
        /**
         * @author JadeXu
         * @// TODO: 2020/12/7 二分查找
         * 思路:
         * 一、获取数组的中间值,先获取下标,方便屡次查找
         * 奇数位的数组直接获取中间位,偶数位的数组获取中间的第一位或第二位均可,通常获取第一位(由于与奇数位获取中间值的方法同样)
         * 二、获取查找的区间范围,start:区间开始的下标,end:区间结束的下标
         * 三、判断查找的数和中间位的数是否相同
         * 相同时,直接返回须要的数据,跳出方法
         * 大于时,即数可能在中间值右边的区间内,此时将开始下标+1,即日后移一位,就获得了中间值右边区间的开始下标
         * 小于时,即数可能在中间值左边的区间内,此时将结束下标-1,即往前移一位,就获得了中间值左边区间的结束下标
         * 当一个区间里,开始下标小于等于结束下标时,该区间才是有效区间,才能继续查找。不然无效,返回找不到,跳出方法
         */
    }
    /**
     *循环
     * @param arr 已经升序好的int[]
     * @param num 须要查找的数字
     * @return 找到则返回下标,没找到则返回-1
     */
    private static int binarySearchByCycle(int[] arr,int num) {
        int start = 0;
        int end = arr.length - 1;

        while (start <= end){
            int mid = (start + end) / 2;
            if(num == arr[mid]){
                return mid;
            }else if(num > arr[mid]){
                start += 1;
            }else {
                end -= 1;
            }
        }
        return -1;
    }

    /**
     * 递归
     * @param arr 已经升序好的int[]
     * @param num 须要查找的数字
     * @param start 区间开始下标
     * @param end 区间结束下标
     * @return 找到则返回下标,没找到则返回-1
     */
    private static int binarySearchByRecursion(int[] arr,int num,int start,int end) {
        int mid = (start + end) / 2;
        if(num == arr[mid]){
            return mid;
        }else if(num > arr[mid]){
            start += 1;
        }else {
            end -= 1;
        }
        if(start <= end && num != arr[mid]){
            mid = binarySearchByRecursion(arr,num,start,end);  //递归继续寻找
        }else {
            mid = -1;
        }
        return mid;
    }
}
相关文章
相关标签/搜索