二分查找
二分查找也稱折半查找(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
}