1. 程式人生 > >二分查詢的兩種實現(Java)

二分查詢的兩種實現(Java)

查詢過程
首先,假設表中元素是按升序排列,將表中間位置記錄的關鍵字與查詢關鍵字比較,如果兩者相等,則查詢成功;否則利用中間位置記錄將表分成前、後兩個子表,如果中間位置記錄的關鍵字大於查詢關鍵字,則進一步查詢前一子表,否則進一步查詢後一子表。重複以上過程,直到找到滿足條件的記錄,使查詢成功,或直到子表不存在為止,此時查詢不成功。
演算法要求
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