Java二分法查詢(遞迴、迴圈實現)
阿新 • • 發佈:2020-12-07
Java二分法查詢(遞迴、迴圈實現)
public class BinarySearch { public static void main(String[] args) { /** * @author JadeXu * @// TODO: 2020/12/7 二分查詢 * 思路: * 1、獲取陣列的中間值,先獲取下標,方便多次查詢 * 奇數位的陣列直接獲取中間位,偶數位的陣列獲取中間的第一位或第二位都可,一般獲取第一位(因為與奇數位獲取中間值的方法一樣) * 2、獲取查詢的區間範圍,start:區間開始的下標,end:區間結束的下標 * 3、判斷查詢的數和中間位的數是否相同 * 相同時,直接返回需要的資料,跳出方法 * 大於時,即數可能在中間值右邊的區間內,此時將開始下標+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 需要查詢的數字 * @paramstart 區間開始下標 * @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; } }