二分查詢的兩種實現(Java)
阿新 • • 發佈:2018-11-28
查詢過程
首先,假設表中元素是按升序排列,將表中間位置記錄的關鍵字與查詢關鍵字比較,如果兩者相等,則查詢成功;否則利用中間位置記錄將表分成前、後兩個子表,如果中間位置記錄的關鍵字大於查詢關鍵字,則進一步查詢前一子表,否則進一步查詢後一子表。重複以上過程,直到找到滿足條件的記錄,使查詢成功,或直到子表不存在為止,此時查詢不成功。
演算法要求
1.必須採用順序儲存結構。
2.必須按關鍵字大小有序排列。
時間複雜度
比如:總共有n個元素,每次查詢的區間大小就是n,n/2,n/4,…,n/2^k(接下來操作元素的剩餘個數),其中k就是迴圈的次數。
由於n/2k取整後>=1,即令n/2k=1,
可得k=log2n,(是以2為底,n的對數),所以時間複雜度可以表示O()=O(logn)。
程式碼實現
package find; public class BinarySearch { // 迴圈實現 public static int binarySearch(int[] data, int target) { int low = 0; int high = data.length; while (low <= high) { int mid = (low + high) / 2; if (target == data[mid]) { return mid; } else if (target < data[mid]) { high = mid - 1; } else { low = mid + 1; } } return -1; } // 遞迴實現 public static int binarySearch(int[] data, int target, int beginIndex, int endIndex) { if (target < data[beginIndex] || target > data[endIndex] || beginIndex > endIndex) { return -1; } int midIndex = (beginIndex + endIndex) / 2; if (target > data[midIndex]) { binarySearch(data, target, midIndex + 1, endIndex); } else if (target < data[midIndex]) { binarySearch(data, target, beginIndex, endIndex - 1); } else { return midIndex; } return -1; } public static void main(String[] args) { int[] data = { 1, 5, 8, 9, 16, 25, 47, 89, 95, 101 }; int target = 16; System.out.println(binarySearch(data, target)); System.out.println(binarySearch(data, target, 0, data.length - 1)); } }
迴圈實現,返回索引位置:4
遞迴實現,返回索引位置:4