二分查找算法

二分查找

二分查找法,在一个有序的数列里,把中间元素v与查找元素target相比较:

  • 若相等则返回
  • 若大于target则在v的右端继续使用二分查找法
  • 若小于target则在v的左端继续使用二分查找法

示意图

示例代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
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)
}
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!

请我喝杯咖啡吧~

支付宝
微信