(1)說明
元素必須是有序的,若是是無序的則要先進行排序操做。
(2)基本思想:
也稱爲是折半查找,屬於有序查找算法。用給定值k先與中間結點的關鍵字比較,中間結點把線形表分紅兩個子表,若相等則查找成功;若不相等,再根據k與該中間結點關鍵字的比較結果肯定下一步查找哪一個子表,這樣遞歸進行,直到查找到或查找結束髮現表中沒有這樣的結點。
(3)複雜度分析
最壞狀況下,關鍵詞比較次數爲log2(n+1),且指望時間複雜度爲O(log2n);
注:折半查找的前提條件是須要有序表順序存儲,對於靜態查找表,一次排序後再也不變化,折半查找能獲得不錯的效率。但對於須要頻繁執行插入或刪除操做的數據集來講,維護有序的排序會帶來不小的工做量,那就不建議使用。——《大話數據結構》算法
//二分查找(折半查找) public static int binarySearch1(int a[], int value) { int low, high, mid; low = 0; high = a.length - 1; while (low <= high) { mid = (low + high) / 2; if (a[mid] == value) return mid; if (a[mid] > value) high = mid - 1; if (a[mid] < value) low = mid + 1; } return -1; } //二分查找,遞歸版本:low 表示開始下標,high 表示最後的下標 public static int binarySearch2(int a[], int value, int low, int high) { int mid = low + (high - low) / 2; if (a[mid] == value) return mid; if (a[mid] > value) return binarySearch2(a, value, low, mid - 1); if (a[mid] < value) return binarySearch2(a, value, mid + 1, high); return -1; } public static void main(String[] args) { int[] a = {49, 38, 65, 197, 76, 213, 27, 50}; int num1 = binarySearch1(a, 213); int num2 = binarySearch2(a, 213,0,a.length-1); System.out.println("數組的下標是:" + num1); System.out.println("數組的下標是:" + num2); }