二分查找

二分查找又稱折半搜索,二分搜索,是一種在有序數組中查找某一特定元素的搜索算法。搜素過程從數組的中間元素開始,若是中間元素正好是要查找的元素,則搜素過程結束;若是某一特定元素大於或者小於中間元素,則在數組大於或小於中間元素的那一半中查找,並且跟開始同樣從中間元素開始比較。若是在某一步驟數組爲空,則表明找不到。這種搜索算法每一次比較都使搜索範圍縮小一半。java

複雜度分析

時間複雜度

折半搜索每次把搜索區域減小一半,時間複雜度爲O\left( \log n  \right)。(n表明集合中元素的個數) 算法

空間複雜度數組

O\left(  1  \right)。雖以遞歸形式定義,可是尾遞歸,可改寫爲循環。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;
}
相關文章
相關標籤/搜索