二分查找go實現

二分查找

二分查找也稱折半查找(Binary Search),它是一種效率較高的查找方法。但是,折半查找要求線性表必須採用順序存儲結構,而且表中元素按關鍵字有序排列。
O(log2n)

go實現

這裏是升序情況
遞歸實現
1. 與中間數比較
2. 小於則遞歸中間數左半數組
3. 大於於則遞歸中間數右半數組 加上 length/2 + 1
4. 返回下標,-1表示沒找到

//遞歸法
func binarySearch(arr []int, need int) int {
	length := len(arr)

	if length == 0 {
		return -1
	}
	//fmt.Println("當前執行到了:", arr)
	if need == arr[length/2] {
		return length / 2
	} else if need < arr[length/2] {
		return binarySearch(arr[:length/2], need)
	} else {
		return binarySearch(arr[length/2+1:], need) + length/2 + 1
	}
}

循環實現
1. 始化左遊標和右遊標
2. 相等則返回下標
3. 大於則左遊標在目前中間位置(i)右移一個
4. 小於則右遊標在目前中間位置(i)左移一個
5. 循環2-4步。左遊標大於右遊標則結束

//循環法
//二分查找,升序數組
func BinarySearch3(arr []int, target int) int {
	//變量l,r的意義是:從[l......r]區間內查找target的數的下標
	l, r := 0, len(arr)-1
	//l == r時,說明數組只有1個數,若l>r時,則數組沒有元素條件結束
	for l <= r {
		mid := (l + r) / 2
		//正好是中位數
		if target == arr[mid] {
			return mid
		}
		//在右區間查找
		if target > arr[mid] {
			l = mid + 1
		} else { //在左區間查找
			r = mid - 1
		}		
	}
	return -1
}
發佈了322 篇原創文章 · 獲贊 163 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章