golang_二分查找的隐藏bug及其优化

二分查找

func binarySearch(a []int, key int) int {
	low := 0
	high := len(a) - 1

	for low <= high {
		mid := low + (high-low)/2
		//mid := (high + low)/2
		midVal := a[mid]

		if midVal < key {
			low = mid + 1
		} else if midVal > key {
			high = mid - 1
		} else {
			return mid //key found
		}
	}
	return -1 //key not found
}

func main() {
	a := make([]int, 100)
	//var a []int
	for i := 1; i <= 100 ; i++ {
		a[i-1] = i
		//a = append(a, i)
	}
	key := 56
	fmt.Println(binarySearch(a, key))
}

Output:

55

这里有3行注释的代码有以下考量:

1.mid := (high + low)/2可能出现的问题是:high + low会溢出的。
使用mid := low + (high-low)/2 可以解决这个问题。

2.var a []int和a = append(a, i) 对切片变量的声明和append会造成内存空间不断的去重新开辟空间存放更大的数据。
这里使用确定长度的切片,并且对每个索引的值进行赋值,不会造成不必要的内存开销,很好的解决了这个问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值