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