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; } }