【第三十六篇】Go 数组排序的基本介绍|循序查找

98 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第26天,点击查看活动详情

一、循序查找

一、介绍

在 Golang中,我们常用的查找方式有两种:

  1. 循序查找
  2. 二分查找(该数组是有序的)

二、案例演示

  1. 有一个数列:白眉鹰王、金毛狮王、紫衫龙王、青翼蝠王,猜数游戏:从键盘中任意输入一个名称,判断数列中是否包含此名称【顺序查找】

思路:

  1. 定义一个数组,白眉鹰王、金毛狮王、紫衫龙王、青翼蝠王,字符串数组
  2. 从控制台接收一个名称,依次比对,如果发现有就提示响应信息。
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. 请对一个有序数组进行二分查找{1,8,10,89,1000,1234},输入一个数看看该数组是否存在次数,并且求出下标,如果没有就提示“没有这个数”。【会使用到递归】

二分法思路分析:比如我们要查找的数是 findVal

  1. arr 是一个有序数组,并且是从小到大排序。
  2. 先找到中间的下标 middle = (leftindex + rightindex) /2,然后让中间下标的值和 findVal 进行比较
    1. 如果 arr[middle]>findVal ,就应该问 leftindex ---- middle -1
    2. 如果 arr[middle]<findVal ,就应该问 middle+1 ---- rightindex
    3. 如果 arr[middle] == findVal ,就找到
  1. 上面的 a,b,c的逻辑会递归执行。
  2. 思考一下,什么样的情况下,就说明找不到【分析出退出递归!!】

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)

}