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