一、查找思想
折半查找 也稱為二分查找,是一種效率較高的查找方法,查找時要求表中的節點按關鍵字的大小排序,並且要求線性表順序存儲。
- 首先用要查找的關鍵字值(key)與中間位置結點的關鍵字值(arr[mid])相比較;
- 若比較結果相等,則查找完成;若不相等,再根據要查找的關鍵字值(key)與該中結點關鍵值(mid)的大小來確定下一步在那個子表中進行;
- 若待查關鍵值大於中間結點的關鍵字值(key > arr[mid])),則應查找中間結點以后的字表,否則(key < arr[mid])),查找中間結點以前的字表;
- 重復步驟1~3,直到找到滿足條件的結點,或者明確表中沒有這樣的結點。
二、圖解
假設用變量 low 和 high 分別存儲待查元素所在范圍的下界和上界,變量 mid 存儲區間的中間位置,即 mid = [(low + high) / 2]。
三、代碼實現
public class BinarySearch { public static void main(String[] args) { int[] arr = {6, 12, 33, 87, 90, 97, 108, 561}; System.out.println(binarySearch(arr, 90)); //遞歸查找 System.out.println(binarySearch(arr, 0, arr.length - 1, 90)); } /** * @param arr 待排序列 * @param key 待查找值 * @return 待查找值在待排序列中的位置 */ private static String binarySearch(int[] arr, int key) { int low = 0; int high = arr.length - 1; while (low <= high) { //必須為 '<=' 否則無法匹配到指定的key; int mid = (low + high) / 2; if (arr[mid] == key) { return "Successful matching [" + (mid + 1) + "]"; } else if (arr[mid] > key) { high = mid - 1; } else { low = mid + 1; } } return "Successful matching -1"; } /** * 遞歸實現二分查找 * @param arr 待排序列 * @param start 待排序列開始值 * @param end 待排序列結束值 * @param key 待查找值 * @return 待查找值在待排序列中的位置 */ private static int binarySearch(int[] arr, int start, int end, int key) { if (key < arr[start] || key > arr[end] || start > end) { //start > end 不能為'>=' return -1; } int mid = (start + end) / 2; if (key > arr[mid]) { return binarySearch(arr, mid + 1, end, key); } else if (key < arr[mid]) { return binarySearch(arr, start, mid - 1, key); } else { return mid + 1; } } }