前言
二分查找算法(Binary Search)是一种基于比较目标值和数组中间元素的快速查找算法。该算法的前提是要求数组有序,即按照升序或降序排列。由于其时间复杂度为O(log n),比线性查找O(n)要快得多,因此被广泛应用于各种场合。二分查找的思想类似于猜数字游戏,每猜一次都可将范围缩小一半,直到找到目标数字或者剩下一个数为止。算法的基本过程如下:
1. 取数组的中间元素,即mid=(left+right)/2
2. 比较中间元素和目标值target的大小
3. 如果中间元素等于目标值,则返回其下标
4. 如果中间元素大于目标值,则在左半部分继续查找,即把right调整为mid-1
5. 如果中间元素小于目标值,则在右半部分继续查找,即把left调整为mid+1
6. 重复步骤1~5,直到找到目标值或者left>right
需要注意的是,二分查找算法只适用于静态有序数组。
也就是说,数组必须是有序的
一、python 实现二分算法
left: 左指针
right: 右指针
mid: 中间值
如果 mid 大于 目标值(target),就移动右指针
小于目标值移动左指针
直到 mid 正好等于 目标值或者 左指针大于右指针 之后结束
def dichoto(lis: list, target: int) -> int:
left = 0
right = len(lis) - 1
while left <= right:
mid = (left + right) // 2
if lis[mid] > target:
right = mid - 1
elif lis[mid] < target:
left = mid + 1
else:
return mid
return -1
lis = [1, 4, 8, 10, 50, 58, 69, 78, 99, 100, 180, 200]
print(dichoto(lis,))
二、go 实现二分法
go语言的 goto 语法这里用着感觉很舒服
其代码逻辑同上
如果 左指针没有超越右指针,说明范围内仍旧有值
就回到 THIS 标记继续执行代码
如果超过了,说明范围内没有值了
直接返回 -1 表示错误
package main
import "fmt"
func dichoto(arr *[]int, target int) int {
left := 0
right := len((*arr)) - 1
var mid int
THIS:
mid = (left + right) / 2
if (*arr)[mid] > target {
right = mid - 1
} else if (*arr)[mid] < target {
left = mid + 1
} else {
return mid
}
if left <= right {
goto THIS
}
return -1
}
func main() {
arr := []int{1,4,8,10,50,58,69,78,99,100,180,200}
index := dichoto(&arr,3)
fmt.Println(index)
}