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