二分搜索,也稱折半搜索、對數搜索,是一種在有序數組中查找某一特定元素的搜索算法。java
搜索過程從數組的中間元素開始,若是中間元素正好是要查找的元素,則搜索過程結束;若是某一特定元素大於或者小於中間元素,則在數組大於或小於中間元素的那一半中查找,並且跟開始同樣從中間元素開始比較。若是在某一步驟數組爲空,則表明找不到。這種搜索算法每一次比較都使搜索範圍縮小一半。算法
二分搜索在狀況下的複雜度是對數時間,進行 O(log n)次比較操做(n在此處是數組的元素數量, O是大O記號, log 是對數)。數組
二分搜索使用常數空間,不管對任何大小的輸入數據,算法使用的空間都是同樣的。除非輸入數據數量不多,不然二分搜索比線性搜索更快,但數組必須事先被排序。code
Java代碼(循環)排序
/** * 二分查找(循環) * @param arr 數組 * @param start 頭索引 * @param end 尾索引 * @param target 目標 * @return 目標索引 */ public static int binarySearchByRecursion(int[] arr, int start, int end, int target){ int result = -1; while (start <= end){ int mid = start + (end - start)/2; //防止溢位 if (arr[mid] > target) end = mid - 1; else if (arr[mid] < target) start = mid + 1; else { result = mid ; break; } } return result; }
Java代碼(遞歸)遞歸
/** * 二分查找(遞歸) * @param arr 數組 * @param start 頭索引 * @param end 尾索引 * @param target 目標 * @return 目標索引 */ public static int binarySearch(int[] arr, int start, int end, int target){ if (start > end) { return -1; } int mid = start + (end - start)/2; //防止溢位 if (arr[mid] > target) { return binarySearch(arr, start, mid - 1, target); } if (arr[mid] < target) return binarySearch(arr, mid + 1, end, target); return mid; }
折半搜索每次把搜索區域減小一半,每次查找的區間大小就是n,n/2,n/2/2,n/2/2/2,簡化爲n/2^k,時間複雜度也就是查找的次數k,最終的區間大小一定爲1,即 n/2^k=1,因此 k=log2 n。(讀做:log以2爲底n的對數)索引
O(1),常數空間,不管對任何大小的輸入數據,算法使用的空間都是同樣的。get