package mainimport ( "fmt")//顺序查找就是在一个序列中一个一个数进行对比指导找到查找的值//顺序查找方法一func Orderfindvalue(arrslice []int, findvalue int) { for i := 0; i < len(arrslice); i++ { if findvalue == arrslice[i] { fmt.Printf("找到了,下标是%v\n", i) //找到以后我们结束循环 break } else if i == len(arrslice)-1 { //这里为什么用下标和最后一个数进行比较,就是当查找到最后一个数 如果也没有找到就返回没有找到 fmt.Printf("没有找到") } }}//顺序查找方法二func Orderfindvalue1(arrslice []int, findvalue int) { //首先我们定义一个index变量 代表索引下标 //如果index 是-1 就是没有找到,这样的话,逻辑会跟清楚,相当一个标志位,代码的可读性也提高了不少 index := -1 for i, value := range arrslice { if value == findvalue { index = i break } } //来判断有没有找到 if index != -1 { fmt.Printf("找到了,下标是%v\n", index) } else { fmt.Printf("没有找到") }}//二分法查找 思路分析变成代码//注意事项,二分法查找必须是在有序序列中查找/*二分法查找的思路:比如我们要查找的数是 findvalue (变量名) // 声明变量 findvalue=81. arrslice 必须是一个有序序列,并且是从小到大排序 // 声明变量 arrslice=[]int{1,3,7,9,10,11,15}2.先找到 中间数组的下标 middle=(leftindex + rightindex)/2 求出我们中间索引的位置,然后让数组中间下标的值和findvalue进行比较,会有以下几种可能2.1 如果arrslice[middle] > findvalue ,就应该向 leftindex---(middle - 1) 中查找2.2 如果arrslice[middle] < findvalue ,就应该向 (middle + 1 ) --- rightindex 中查找2.3 如果 arrslice[middle] == findvalue ,就说明找到了2.4 上面的 2.1 、 2.2 、2.3 的逻辑会递归执行3. 想一下,在上面情况下,就说明找不到( 分析出退出递归的条件 ) 凡是涉及到递归,都要考虑退出递归不然就死归了 if leftindex > rigthindex { //找不到 return }*/var count int = 0func BinaryFind(arrslice []int, leftindex int, rigthindex int, findvalue int) { if leftindex > rigthindex { fmt.Printf("没有找到\n") return } middle := (leftindex + rigthindex) / 2 //如果中间索引的值大于我们找的值 就应该向 leftindex---(middle - 1) 中查找 if arrslice[middle] > findvalue { BinaryFind(arrslice, leftindex, (middle - 1), findvalue) count++ } else if arrslice[middle] < findvalue { BinaryFind(arrslice, (middle + 1), rigthindex, findvalue) count++ } else { fmt.Printf("找到了 下标是%v\n", middle) count++ }}func main() { //无序序列 也就是一个切片或者数组(切片底层实际上也是数组) // arrslice := []int{1, 7, 2, 8, 9, 3} //顺序查找方法一 // Orderfindvalue(arrslice, 9) //顺序查找方法二 (推荐方法) // Orderfindvalue1(arrslice, 10) //二分法查找 //申明有序序列 arrslice := []int{1, 3, 7, 9, 10, 11, 15} BinaryFind(arrslice, 0, len(arrslice)-1, 9) fmt.Printf("count:%v\n", count)}