算法描述:
在一组有序的,并能支持随机访问的数组中,将数组一分为二,将要查询的元素和分割点进行比较,时间复杂度为O(lgn)。
有以下三种情况:
- 相等直接返回
- 元素大于分割点,在分割点右侧继续查找
- 元素小于分割点,在分割点左侧继续查找
相关变形如下:
- 查找第一个值等于给定的,在相等的时候做处理,向前查
- 查找最后一个值等于给定的值,在相等的时候做处理,向后查
- 查找第一个大于等于给定的值,判断边界减1
- 查找最后一个小于等于给定的值,判断边界加1
代码片段如下:
package main
func BinarySearch(ary []int, findData int) int {
small, big := 0, len(ary)-1
for small <= big {
currNum := (small + big) / 2
if ary[currNum] > findData {
big = currNum - 1
} else if ary[currNum] < findData {
small = currNum + 1
} else {
return currNum
}
}
return -1
}