21.二分查詢演算法
阿新 • • 發佈:2022-01-17
1.演算法
public static int binarySearch(int[] arr, int left, int right, int findVal) { // 當 left > right 時,說明遞迴整個陣列,但是沒有找到 if (left > right) { return -1; } int mid = (left + right) / 2; int midVal = arr[mid]; if (findVal > midVal) { // 向 右遞迴 return binarySearch(arr, mid + 1, right, findVal); } else if (findVal < midVal) { // 向左遞迴 return binarySearch(arr, left, mid - 1, findVal); } else { return mid; } }
2.課後思考題: {1,8, 10, 89, 1000, 1000,1234} 當一個有序陣列中,有多個相同的數值時,如何將所有的數值都查詢到,比如這裡的 1000
public static List<Integer> binarySearch2(int[] arr, int left, int right, int findVal) { System.out.println("hello~"); // 當 left > right 時,說明遞迴整個陣列,但是沒有找到 if (left > right) { return new ArrayList<Integer>(); } int mid = (left + right) / 2; int midVal = arr[mid]; if (findVal > midVal) { // 向 右遞迴 return binarySearch2(arr, mid + 1, right, findVal); } else if (findVal < midVal) { // 向左遞迴 return binarySearch2(arr, left, mid - 1, findVal); } else { // * 思路分析 // * 1. 在找到mid 索引值,不要馬上返回 // * 2. 向mid 索引值的左邊掃描,將所有滿足 1000, 的元素的下標,加入到集合ArrayList // * 3. 向mid 索引值的右邊掃描,將所有滿足 1000, 的元素的下標,加入到集合ArrayList // * 4. 將Arraylist返回 List<Integer> resIndexlist = new ArrayList<Integer>(); //向mid 索引值的左邊掃描,將所有滿足 1000, 的元素的下標,加入到集合ArrayList int temp = mid - 1; //退出 while (temp >= 0 && arr[temp] == findVal) { //否則,就temp 放入到 resIndexlist resIndexlist.add(temp); temp -= 1; //temp左移 } resIndexlist.add(mid); // //向mid 索引值的右邊掃描,將所有滿足 1000, 的元素的下標,加入到集合ArrayList temp = mid + 1; //退出 while (temp <= arr.length - 1 && arr[temp] == findVal) { //否則,就temp 放入到 resIndexlist resIndexlist.add(temp); temp += 1; //temp右移 } return resIndexlist; } }