Golang实现二分查找

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
}

  

原文地址:https://www.cnblogs.com/hardykay/p/14504132.html