我正在练习一道面试算法题,现在用Go语言进行编码。目的是熟练掌握常见面试算法,同时提升自己在Go语言上的技能。我正在尝试对一个数字数组进行二分查找。
package main
import "fmt"
func main() {
searchField := []int{2, 5, 8, 12, 16, 23, 38, 56, 72, 91}
searchNumber := 23
fmt.Println("Running Program")
fmt.Println("Searching list of numbers: ", searchField)
fmt.Println("Searching for number: ", searchNumber)
numFound := false
//searchCount not working. Belongs in second returned field
result, _ := binarySearch2(searchField, len(searchField), searchNumber, numFound)
fmt.Println("Found! Your number is found in position: ", result)
//fmt.Println("Your search required ", searchCount, " cycles with the Binary method.")
}
func binarySearch2(a []int, field int, search int, numFound bool) (result int, searchCount int) {
//searchCount removed for now.
searchCount, i := 0, 0
for !numFound {
searchCount++
mid := i + (field-i)/2
if search == a[mid] {
numFound = true
result = mid
return result, searchCount
} else if search > a[mid] {
field++
//i = mid + 1 causes a stack overflow
return binarySearch2(a, field, search, numFound)
}
field = mid
return binarySearch2(a, field, search, numFound)
}
return result, searchCount
}
我遇到的主要问题是:
1)当在列表中的数字高于我的mid搜索时,我是否真的在继续进行二进制搜索,或者已经变成了顺序搜索?我该如何解决这个问题?我已经注释掉了另一个选项,因为它会导致堆栈溢出。
2)我想添加一个步骤计数器,以查看完成搜索需要多少步。其他搜索方法也可以使用。如果我按原样打印搜索计数,它总是读取为1。这是因为我需要返回它(并且在方法中调用它),以便在标头中调用它吗?
我知道Go有简化此过程的方法。我正在努力提高我的知识和编码技能。感谢您的帮助。