二分查找
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会造成内存空间不断的去重新开辟空间存放更大的数据。
这里使用确定长度的切片,并且对每个索引的值进行赋值,不会造成不必要的内存开销,很好的解决了这个问题。