二分查找又稱折半搜索,二分搜索,是一種在有序數組中查找某一特定元素的搜索算法。搜素過程從數組的中間元素開始,若是中間元素正好是要查找的元素,則搜素過程結束;若是某一特定元素大於或者小於中間元素,則在數組大於或小於中間元素的那一半中查找,並且跟開始同樣從中間元素開始比較。若是在某一步驟數組爲空,則表明找不到。這種搜索算法每一次比較都使搜索範圍縮小一半。java
折半搜索每次把搜索區域減小一半,時間複雜度爲。(n表明集合中元素的個數) 算法
空間複雜度數組
。雖以遞歸形式定義,可是尾遞歸,可改寫爲循環。code
實現orm
// 遞歸 public static int binary_search(int[] arr, int low, int high, int key) { int mid = low + (high - low) / 2;// low+((high-low)/2)不存在溢出問題 // 使用(low+high)/2會有整數溢出的問題 // 當low+high的結果大於表達式結果類型所能表示的最大值時,出產生溢出問題,再/2致使結果不正確 if (low > high) return -1; else { if (arr[mid] == key) return mid; else if (arr[mid] > key) return binary_search(arr, low, mid - 1, key); else return binary_search(arr, mid + 1, high, key); } } // 非遞歸 public static int binary_search2(int[] arr, int low, int high, int key) { while (low <= high) { int mid = low + (high - low) / 2; if (arr[mid] == key) return mid; else if (arr[mid] > key) high = mid - 1; else low = mid + 1; } return -1; }