我知道Go有一个包含搜索功能的sort
包,但这是出于教育目的。我一直试图在Go中实现二进制搜索算法,但我还没有能够让它工作。
这是我的代码:
package main
import "fmt"
func BinarySearch(data []int, target int, low int, high int) (index int, found bool) {
mid := (high + low) / 2
if low > high {
index = -1
found = false
} else {
if target < data[mid] {
BinarySearch(data, target, low, mid - 1)
} else if target > data[mid] {
BinarySearch(data, target, mid + 1, high)
} else if target == data[mid] {
index = mid
found = true
} else {
index = -1
found = false
}
}
return
}
func main() {
data := []int {2, 4, 6, 8, 9, 11, 12, 24, 36, 37, 39, 41, 54, 55, 56,}
index, found := BinarySearch(data, 8, 0, len(data) - 1)
fmt.Println(index, found)
}
始终打印0 false
。为什么呢?
答案 0 :(得分:5)
二进制搜索的逻辑是合理的。唯一的问题是您忘记将每次递归调用的结果分配给index
和found
。
目前您有这些递归调用:
BinarySearch(data, target, low, mid - 1)
//...
BinarySearch(data, target, mid + 1, high)
您只需分配结果:
index, found = BinarySearch(data, target, low, mid - 1)
//...
index, found = BinarySearch(data, target, mid + 1, high)
答案 1 :(得分:1)
我们使用递归或循环来实现。
函数将包含一个数组,我们将在其中进行搜索。然后目标值等于我们要搜索的值。
lowIndex
将指示我们开始搜索。
highIndex
表示搜索的最后位置。
然后该函数返回我们要搜索的目标值的位置。
在参数中包含lowIndex
和highIndex
的原因是要搜索数组的子集。
func binarySearch(array []int, target int, lowIndex int, highIndex int) int {
//specify condition to end the recursion
if highIndex < lowIndex {
return -1
}
// Define our middle index
mid := int((lowIndex + highIndex) / 2)
if array[mid] > target {
return binarySearch(array, target, lowIndex,mid)
}else if array[mid] < target {
return binarySearch(array, target,mid+1,highIndex)
}else {
return mid
}
}
func iterbinarySearch(array []int, target int, lowIndex int, highIndex int) int {
startIndex := lowIndex
endIndex := highIndex
var mid int
for startIndex < endIndex {
mid = int((lowIndex + highIndex) / 2)
if array[mid] > target {
return binarySearch(array, target, lowIndex, mid)
} else if array[mid] < target {
return binarySearch(array, target, mid+1, highIndex)
} else {
return mid
}
}
return -1
}
答案 2 :(得分:0)
http://play.golang.org/p/BbL-y7pJMi
据我所知,工作得很好。