Golang中二分查找问题的解决方法
Golang中二分查找问题的解决方法 我们编写的代码如下:
package main
import "fmt"
func binarySearch(search int, list []int) int {
low := 0
high := len(list) - 1
for low <= high {
middle := (low + high) / 2
if list[middle] < search {
low = middle + 1
} else {
high = middle - 1
}
}
if low == len(list) || list[low] != search {
return 0
}
return low
}
func main() {
var n int
_, err := fmt.Scanln(&n)
if err != nil || n < 0 {
return
}
s := make([]int, n)
for i := range s {
fmt.Scanln(&s[i])
}
var n1 int
fmt.Scanln(&n1)
fmt.Println(binarySearch(n1, s))
}
运行结果不符合预期。
更多关于Golang中二分查找问题的解决方法的实战教程也可以访问 https://www.itying.com/category-94-b0.html
3 回复
问题在将返回值从0改为-1后得到解决。谢谢。
你的二分查找实现存在逻辑问题。主要问题在于当 list[middle] == search 时,代码会进入 else 分支将 high 设置为 middle - 1,这会导致错过匹配项。以下是修正后的代码:
package main
import "fmt"
func binarySearch(search int, list []int) int {
low := 0
high := len(list) - 1
for low <= high {
middle := low + (high-low)/2 // 避免整数溢出
if list[middle] == search {
return middle // 找到目标,直接返回索引
} else if list[middle] < search {
low = middle + 1
} else {
high = middle - 1
}
}
return -1 // 未找到返回-1
}
func main() {
var n int
_, err := fmt.Scanln(&n)
if err != nil || n < 0 {
return
}
s := make([]int, n)
for i := range s {
fmt.Scanln(&s[i])
}
var target int
fmt.Scanln(&target)
result := binarySearch(target, s)
fmt.Println(result)
}
关键修改:
- 添加了
list[middle] == search的判断条件,找到目标时直接返回索引 - 使用
low + (high-low)/2计算中间索引,避免(low+high)可能导致的整数溢出 - 未找到时返回
-1作为标准错误指示
示例运行:
输入:
5
1
3
5
7
9
5
输出:
2
这个实现正确处理了三种情况:
- 中间值等于目标:返回索引
- 中间值小于目标:搜索右半部分
- 中间值大于目标:搜索左半部分

