持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第26天,点击查看活动详情
一、循序查找
一、介绍
在 Golang中,我们常用的查找方式有两种:
- 循序查找
- 二分查找(该数组是有序的)
二、案例演示
- 有一个数列:白眉鹰王、金毛狮王、紫衫龙王、青翼蝠王,猜数游戏:从键盘中任意输入一个名称,判断数列中是否包含此名称【顺序查找】
思路:
- 定义一个数组,白眉鹰王、金毛狮王、紫衫龙王、青翼蝠王,字符串数组
- 从控制台接收一个名称,依次比对,如果发现有就提示响应信息。
package main
import "fmt"
func main() {
// 思路:
// 1. 定义一个数组,白眉鹰王、金毛狮王、紫衫龙王、青翼蝠王,字符串数组
// 2. 从控制台接收一个名称,依次比对,如果发现有就提示响应信息。
// 代码
names := [4]string{"白眉鹰王", "金毛狮王", "紫衫龙王", "青翼蝠王"}
var heroName = ""
fmt.Println("请输入要查找的人名...")
fmt.Scanln(&heroName)
// 第一种方式,顺序查找
for i := 0; i < len(names); i++ {
if heroName == names[i] {
fmt.Printf("找到%v , 下标%v", heroName, i)
break
} else if i == (len(names) - 1) {
fmt.Printf("没有找到%v\n", heroName)
}
}
}
package main
import "fmt"
func main() {
// 思路:
// 1. 定义一个数组,白眉鹰王、金毛狮王、紫衫龙王、青翼蝠王,字符串数组
// 2. 从控制台接收一个名称,依次比对,如果发现有就提示响应信息。
// 代码
names := [4]string{"白眉鹰王", "金毛狮王", "紫衫龙王", "青翼蝠王"}
var heroName = ""
fmt.Println("请输入要查找的人名...")
fmt.Scanln(&heroName)
// 第一种方式,顺序查找
for i := 0; i < len(names); i++ {
if heroName == names[i] {
fmt.Printf("找到%v , 下标%v", heroName, i)
break
} else if i == (len(names) - 1) {
fmt.Printf("没有找到%v\n", heroName)
}
}
// 顺序查找第二种方式:
index := -1
for i := 0; i < len(names); i++ {
if heroName == names[i] {
index = i // 将找到的值对应的下标赋给index
break
}
}
if index != -1 {
fmt.Printf("找到%v , 下标%v", heroName, index)
} else {
fmt.Println("没有找到", heroName)
}
}
- 请对一个有序数组进行二分查找
{1,8,10,89,1000,1234},输入一个数看看该数组是否存在次数,并且求出下标,如果没有就提示“没有这个数”。【会使用到递归】
二分法思路分析:比如我们要查找的数是 findVal
- arr 是一个有序数组,并且是从小到大排序。
- 先找到中间的下标
middle = (leftindex + rightindex) /2,然后让中间下标的值和 findVal 进行比较
-
- 如果 arr[middle]>findVal ,就应该问 leftindex ---- middle -1
- 如果 arr[middle]<findVal ,就应该问 middle+1 ---- rightindex
- 如果 arr[middle] == findVal ,就找到
- 上面的 a,b,c的逻辑会递归执行。
- 思考一下,什么样的情况下,就说明找不到【分析出退出递归!!】
package main
import "fmt"
// 二分查找函数
func BinaryFind(arr *[6]int, leftIndex int, rightIndex int, findVal int) {
// 判断 leftIndex 是否大于 rightIndex
if leftIndex > rightIndex {
fmt.Println("找不到")
return
}
// 先找到,中间的下标。
middle := (leftIndex + rightIndex) / 2
if (*arr)[middle] > findVal {
// 说明我们要查找的数,应该在 leftIndex --- middle -1
BinaryFind(arr, leftIndex, middle-1, findVal)
} else if (*arr)[middle] < findVal {
BinaryFind(arr, middle+1, rightIndex, findVal)
} else {
// 找到了
fmt.Printf("找到了,下标为%v \n", middle)
}
}
func main() {
arr := [6]int{1, 8, 10, 89, 1000, 1234}
// 测试一下
BinaryFind(&arr, 0, len(arr)-1, 1000)
BinaryFind(&arr, 0, len(arr)-1, 1)
BinaryFind(&arr, 0, len(arr)-1, -6)
}