二分查找法,在一个有序的数列里,把中间元素v与查找元素target相比较:
- 若相等则返回
- 若大于target则在v的右端继续使用二分查找法
- 若小于target则在v的左端继续使用二分查找法
二分查找法-迭代法(Go语言)
package main
import "fmt"
//二分查找(前提必须在有序的数组里,查找target)
//如果找到target,返回相应的索引index
//如果没有找到target,返回-1
//时间复杂度O(logN)
func binarySearch(arr *[]int, target int, l int, r int) int {
//在arr[l...r]中查找target
for l <= r {
//middleIndex := r+l/2 //注意:这里容易产生bug(r+l溢出int最大值),改写成如下方式
middleIndex := l + (r-l)/2
if (*arr)[middleIndex] == target {
return middleIndex
}else if (*arr)[middleIndex] > target {
//在arr[l...middleIndex - 1]中查找target
r = middleIndex - 1
}else {
//在arr[middleIndex + 1...r]中查找target
l = middleIndex + 1
}
}
return -1
}
func main() {
arr := []int{1,2,5,8,11,13}
index := binarySearch(&arr, 11,0, len(arr)-1)
fmt.Println(index)
}
输出:
4
二分查找法-递归法(Go语言):
package main
import "fmt"
//二分查找(前提必须在有序的数组里,查找target)
//如果找到target,返回相应的索引index
//如果没有找到target,返回-1
//时间复杂度O(logN)
func binarySearch(arr *[]int, target int, l int, r int) int {
//在arr[l...r]中查找target
for l <= r {
//middleIndex := r+l/2 //注意:这里容易产生bug(r+l溢出int最大值),改写成如下方式
middleIndex := l + (r-l)/2
if (*arr)[middleIndex] == target {
return middleIndex
}else if (*arr)[middleIndex] > target {
//在arr[l...middleIndex - 1]中查找target
return binarySearch(arr, target, l, middleIndex - 1)
}else {
//在arr[middleIndex + 1...r]中查找target
return binarySearch(arr, target, middleIndex + 1, r)
}
}
return -1
}
func main() {
arr := []int{1,2,5,8,11,13}
index := binarySearch(&arr, 11,0, len(arr)-1)
fmt.Println(index)
}
输出:
4
时间复杂度O(logN)
,递归法的性能比迭代法的略差。