开发者学堂课程【GO 语言核心编程-基础语法、数组、切片、Map:顺序查找】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/625/detail/9648
顺序查找
内容介绍
一、查找方法简介
二、案例演示
一、查找方法简介
在 Golang 中,常用的查找有两种:
1、顺序查找:
按照顺序进行一个一个的比对,查看数组里面有没有需要查找的元素。
2、二分查找:
相对效率高很多,其中用到了递归的知识点,也就是说在一个有序数列里面进行二分查找,因此要用二分查找有一个前提,就是该数组要是有序的,不是有序的,就不能使用二分查找。所以要使用二分查找就要先将数组有序排列,然后再使用二分查找。
二、案例演示
1、案例要求
有一个数列: 白眉鹰王、金毛狮王、紫衫龙王、青翼蝠王
猜数游戏:从键盘中任意输入一个名称,判断数列中是否包含此名称[顺序查找]
2、分析思路
首先新建文件夹 findemo,再新建文件 main.go,文件中引入“fmt“包,然后定义一个主函数。
package main
import(
“fmt”
)
func main( ){
}
题目要求的顺序查找,那就要按照顺序查找,下面开始分析思路。
(1)首先定义一个数组,数组中存放信息为白眉鹰王、金毛狮王、紫衫龙王、青翼蝠王,而只有字符串数组能存放这些信息。
(2)从控制台接收一个名称,然后进行依次比较,如果发现有提示相应信息。
代码分析,第一步先定义一个数组 name,有4个元素,元素值为白眉鹰王、金毛狮王、紫衫龙王、青翼蝠王,那既然是字符串数组,就需要““将元素括起来。第二步定义一个变量 heroName,给变量一个空值,然后进行信息提示为”请输入要查找的人名“,再 Scanln 进行接收。接下来在上面代码的基础上进行顺序查找:
3、方式一
顺序查找第一种方式:
用 for 循环一个个的查找,i 初始值为0,i 小于len(names),要把数组的长度求出,再 i++,那如果当前输入的名称heroName 等于当前对应的数组下标为i的值,则说明找到了,就提示信息为找到 herName,下标为 i,然后退出。那如果找到了就提示找到的信息,没找到就进行 else,这是不一定的,因为第一次查找可能没有找到,但后面再进行几次说不定又找到了,所以不能马上做 else 判断,应该为 else if,如果i等于长度减1,就说明i到达了最后一个元素,而最后一个元素都还没在 if 中找到,就说明输入的名称没有找到,所以这时就提示没有找到 heroName。
代码为:
func main() {
//代码
names :=[4]string{"白眉鹰王”,”金毛狮王",“紫衫龙王","青翼蝠王”}
var heroName =””
fmt.PrintIn("请输入要查找的人名...")
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,下标", heroName, i)
}
}
下面进行运行一下:
D:\goproject\src\go_code\chapte08\cd finddemo
D:\goproject\src\go_code\chapter08\finddemo>go run main. go
请输人要查找的人名...
hello
没有找到 hello
D:\goproject\src\go_code\chapter08\finddemo>go run main. go
请输入要查的人名..
金毛狮王
找到金毛狮王,下标1
回到代码中查看金毛狮王下标确实为1。
4、方式二
第二种方式:
先定义下标 index 等于-1,如果找到了就把真实的下标赋值给 index,如果找不到 index 就一直保持值为-1,整个思路就这里和上面的变了,与上面的开头思路是一样的,如果输入的 heroName 等于当前下标为 i 的值,就是在数组中找到了输入的值,便将找到的值对应的下标 i 赋给 index, 再 break 退出。这时通过看 index 的值就可以判断找没找到,如果 index 等于-1,就说明没有找到,则打印,如果不等于-1就说明找到了,则打印 heroName,下标值为index。这里推荐使用第二种方式思路更清晰,找到了就 break 跳出,再将下标放到 index 中,直接通过 index 判断有没有找到。
代码为:
index :=-1
for i := 0; i < len(names);i++ {
if heroName == names [i] {
index=i //将找到的值对应的下标赋给 index
break
}
}
if index !=-1 {
fmt.Printf("找到%v,下标%v \n", heroName, index)
} else {
fmt.Println("没有找到",heroName)
}
下面进行运行一下:
D:\goproject\src\go_code\chapter08\finddemo>go run main. go
请输人要查找的人名...
tom
没有找到tom
D:\goproject\src\go_code\chapter08\finddemo>go run main. go
请输入要查的人名..
紫衫龙王
找到紫衫龙王,下标2
回到代码中观察紫衫龙王下标确实为2,功能实现成功。那这里可以发现其实顺序查找效率是比较低的,因为如果数组中有很多元素,是一些数字的话,要把整个数组扫描一遍才能知道元素是否存在,所以还有一种查找方式是二分查找。