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 }