Go学习笔记(7)-排序和查找

Go学习笔记(7)

排序和查找

排序的基本介绍

冒泡排序的思路分析

冒泡排序实现

课后练习

要求同学们能够,不看老师的代码,可以默写冒泡排序法(笔试题)

查找

介绍:

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

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

案例演示:

  1. 有一个数列:白眉鹰王、金毛狮王、紫衫龙王、青翼蝠王

    猜数游戏:从键盘中任意输入一个名称,判断数列中是否包含此名称【顺序查找】

代码:

  1. 请对一个有序数组进行二分查找 {1,8, 10, 89, 1000, 1234} ,输入一个数看看该数组是否存在此数,并且求出下标,如果没有就提示"没有这个数"。【会使用到递归】

二分查找的思路分析:

二分查找的代码实现:

package main
import (
"fmt"
)
    //二分查找的函数
    /*
    二分查找的思路: 比如我们要查找的数是 findVal
    1. arr 是一个有序数组,并且是从小到大排序
    2. 先找到 中间的下标 middle = (leftIndex + rightIndex) / 2, 然后让 中间下标的值和 findVal 进行
    比较
    2.1 如果 arr[middle] > findVal , 就应该向 leftIndex ---- (middle - 1)
    2.2 如果 arr[middle] < findVal , 就应该向 middel+1---- rightIndex
    2.3 如果 arr[middle] == findVal , 就找到
    2.4 上面的 2.1 2.2 2.3 的逻辑会递归执行
    3. 想一下,怎么样的情况下,就说明找不到[分析出退出递归的条件!!]
    if leftIndex > rightIndex {
    // 找不到..
    return ..
    }
    */
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 --- middel-1
            BinaryFind(arr, leftIndex, middle - 1, findVal)
		} else if (*arr)[middle] < findVal {
            //说明我们要查找的数,应该在 middel+1 --- rightIndex
            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, -6)
}

二维数组的介绍

多维数组我们只介绍二维数组

二维数组的应用场景

比如我们开发一个五子棋游戏,棋盘就是需要二维数组来表示。

二维数组快速入门

快速入门案例:

请用二维数组输出如下图形

0 0 0 0 0 0

0 0 1 0 0 0

0 2 0 3 0 0

0 0 0 0 0 0

代码演示

使用方式 1: 先声明/定义,再赋值

语法: var 数组名 [大小][大小]类型

比如: var arr [2][3]int , 再赋值。

使用演示

二维数组在内存的存在形式(重点)

使用方式 2: 直接初始化

声明:var 数组名 [大小][大小]类型 = [大小][大小]类型{{初值..},{初值..}}

赋值(有默认值,比如 int 类型的就是 0)

使用演示

说明:二维数组在声明/定义时也对应有四种写法[和一维数组类似]

var 数组名 [大小][大小]类型 = [大小][大小]类型{{初值..},{初值..}}

var 数组名 [大小][大小]类型 = [...][大小]类型{{初值..},{初值..}}

var 数组名 = [大小][大小]类型{{初值..},{初值..}}

var 数组名 = [...][大小]类型{{初值..},{初值..}}

二维数组的遍历

双层 for 循环完成遍历

for-range 方式完成遍历

案例演示:

二维数组的应用案例

要求如下:

定义二维数组,用于保存三个班,每个班五名同学成绩,

并求出每个班级平均分、以及所有班级平均分

代码

end
  • 作者:AWhiteElephant(联系作者)
  • 发表时间:2022-05-26 15:54
  • 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)
  • 转载声明:如果是转载栈主转载的文章,请附上原文链接
  • 评论