package main
import (
"fmt"
"math/rand"
"time"
)
// 二分法判断某个值是否在数组中存在,如果存在则返回所在的位置,不存在则返回-1
func dichotomy(a []int, value int, position ...int ) int {
// 开始匹配值等于0,
start := 0
// 结束位置要取得数组总长度,既最大下表加1,因为采用向下取整,如果不加1,则永远取不到最后一位
end := len(a)
if len(position) == 2 {
start = position[0]
end = position[1]
}
if end <= start || end < 0 || start < 0{
return -1
}
// 获取中间值,不管总长度是基数还是偶数,都采用向下取整,以免数组越界,
// 其中start + (end - start)/2 >= 0 (start => 0,end >= 0, end > start)该式子永远成立
median := start + (end - start)/2
if a[median] == value {
return median
}
// 当他们相差1的时候说明已经全部匹配完毕
if end-start == 1 {
return -1
}
// 执行子二分
if value > a[median] {
return dichotomy(a, value, median, end)
} else {
return dichotomy(a, value, start, median)
}
}
func main() {
a := genRand(500, 10)
// 输出获取到的数组
fmt.Println(a)
// 输出数组长度
fmt.Println(len(a))
// 开始使用二分查找
fmt.Println(dichotomy(a, 496))
fmt.Println(dichotomy(a, 1))
}
// 构建随机数组
func genRand(max int, carry int) []int {
a := make([]int, 0)
f := func(n int) int {
rand.Seed(time.Now().Unix())
angin:
i := rand.Intn(n)
if i == 0 {
goto angin
}
return i
}
for i := 1; i < max; i += f(carry) {
a = append(a, i)
}
return a
}