介绍

这个是在B站上看边看视频边做的笔记,这一章是GO语言的排序和查找

有golang怎么排序,golang的顺序查找和二分查找,go语言中顺序查找二分查找介绍和案例,具体请看【文章目录】

配套视频自己去B站里面搜【go语言】,最高的播放量就是

里面的注释我写的可能不太对,欢迎大佬们指出╰(°▽°)╯

文章目录

  • 介绍
  • (六)、排序和查找
    • 一、排序
    • 二、查找
      • 1.顺序查找
      • 2.二分查找(该数组是有序)
    • 三、二维数组
      • 1.二维数组的介绍
      • 2.二维数组的应用场景
      • 3.二维数组快速入门
      • 4.使用方式1:先声明/定义,再赋值
      • 5.使用方式2:直接初始化
      • 6.二维数组的遍历
      • 7.二维数组的应用案例
      • 8.练习

(六)、排序和查找

一、排序

排序是将一组数据,依指定的顺序进行排列的过程。

排序的分类:

1)内部排序:

​ 指将需要处理的所有数据都加载到内部存储器中进行排序。

​ 包括(交换式排序法、选择式排序法和插入式排序法);

2)外部排序法:

​ 数据量过大,无法全部加载到内存中,需要借助外部存储进行

​ 排序。包括(合并排序法和直接合并排序法)

冒泡排序法案例:

下面我们举-一个具体的案例来说明冒泡法。我们将五个无序:24, 69, 80, 57, 13使用冒泡排序法将其排成一一个从小到大的有序数列。

代码思路:

//冒泡排序func BubbleSort(arr *[5]int) {fmt.Println("排序前arr=", (*arr))temp := 0 //临时变量,用来做交换//完成第一轮排序for j := 0; j < 4; j++ {if (*arr)[j] > (*arr)[j+1] {//交换temp = (*arr)[j](*arr)[j] = (*arr)[j+1](*arr)[j+1] = temp}}fmt.Println("第1次排序后arr=", (*arr))//完成第二轮排序for j := 0; j < 3; j++ {if (*arr)[j] > (*arr)[j+1] {//交换temp = (*arr)[j](*arr)[j] = (*arr)[j+1](*arr)[j+1] = temp}}fmt.Println("第1次排序后arr=", (*arr))}func main() {arr := [5]int{24, 69, 80, 57, 13} //定义数组//将数组传递给一个函数,完成排序BubbleSort(&arr) //传入arr地址
}

代码完全体:

//冒泡排序func BubbleSort(arr *[5]int) {fmt.Println("排序前arr=", (*arr))temp := 0 //临时变量,用来做交换//完成第一轮排序for i := 0; i < len(*arr)-1; i++ {for j := 0; j < len(*arr)-1-i; j++ {if (*arr)[j] > (*arr)[j+1] {//交换temp = (*arr)[j](*arr)[j] = (*arr)[j+1](*arr)[j+1] = temp}}fmt.Printf("第%v次排序后arr=%v\n", i+1, (*arr))}}func main() {arr := [5]int{24, 69, 80, 57, 13} //定义数组//将数组传递给一个函数,完成排序BubbleSort(&arr) //传入arr地址fmt.Println("main arr=", arr) //传入的是地址,所以BubbleSort可以修改main函数里面的数组
}

二、查找

介绍:

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

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

1.顺序查找

案例演示:

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

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

func main() {/*有一个数列:白眉鹰王、金毛狮王、紫衫龙王、青翼蝠王猜数游戏:从键盘中任意输入一个名称,判断数列中是否包含此名称【顺序查找】思路:1.定义一个数组,白眉鹰王、金毛狮王、紫衫龙王、青冀蝠王  字符串数组2.从控制台接收一个名词,依次比较,如果发现有,提示*/name := [4]string{"白眉鹰王", "金毛狮王", "紫衫龙王", "青冀蝠王"}var heroName = ""fmt.Println("请输入人名:")fmt.Scanln(&heroName)//顺序查找:第一种方式for i := 0; i < len(name); i++ {if heroName == name[i] {fmt.Printf("第一种方式找到了%v\n", heroName)break //退出循环} else if i == len(name)-1 {fmt.Printf("第一种方式没有找到%v\n", heroName)}}//顺序查找:第二种方式(推荐使用第二种方式)index := -1for i := 0; i < len(name); i++ {if heroName == name[i] {index = ibreak}}if index != -1 {fmt.Printf("第二种方式找到了%v\n", heroName)} else {fmt.Printf("第二种方式没有找到%v\n", heroName)}
}

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

请对一个有序数组进行二分查找{1,8, 10, 89, 1000, 1234} ,输入一个数看看该数组是否存

在此数,并且求出下标,如果没有就提示"没有这个数"。【会使用到递归】

二分查找的思路分析:

代码:

package mainimport "fmt"/*
arr=[1,8, 10, 89, 1000, 1234] 8
二分查找的思路:比如我们要查找的数是findVal
1. arr是一个有序数组,并且是从小到大排序2.先找到中间的下标middle =(leftIndex+ rightIndex)/2,然后让中间下标的值和findVal进行比较
2.1如果 arr[middle] > findVal ,就应该向 leftIndex --- (middle-1)
2.2如果 arr[middle] < findVal ,就应该向 middle+1--- rightIndex
2.3如果 arr[middle] ==findVal 就找到
2.4.上面的2.12.22.3的逻辑会递归执行3.想一下,怎么样的情况下,就说明找不到[分析出退出递归的条件!]
if leftIndex> rightindex{
//找不到..
return ..
}*/func BinaryFind(arr *[6]int, leftIndex int, rightIndex int, findVal int) { //返回最小至下标、最大值下标、中间值下标//由于是有序排序,而且是从小到大顺序排列//判断leftIndex是否大于rightIndexif leftIndex > rightIndex {fmt.Println("没找到值")return}middle := (leftIndex + rightIndex) / 2 //算出中间的下标//中间下标的值小于要寻找的值,说明要找的值在leftIndex 到 middle-1 之间if (*arr)[middle] > findVal {BinaryFind(arr, leftIndex, middle-1, findVal) //返回给函数BinaryFind参数并且再次执行} else if (*arr)[middle] < findVal { //中间下标的值大于于要寻找的值,说明要找的值在middle+1 到 rightIndexBinaryFind(arr, middle+1, rightIndex, findVal)} else {fmt.Printf("找到了%v,下标是[%v]", values, middle)}
}var values intfunc main() {fmt.Println("你要查找的值是多少:")fmt.Scanln(&values)arr := [6]int{1, 8, 10, 89, 1000, 1234}BinaryFind(&arr, 0, len(arr)-1, values)
}

三、二维数组

1.二维数组的介绍

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

2.二维数组的应用场景

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

3.二维数组快速入门

快速入门案例:

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

    0 0 0 0 0 0
    0 0 1 0 0 0
    0 2 0 3 0 0
    0 0 0 0 0 0

  • 代码演示

    func main() {/*请用二维数组输出如下图形0 0 0 0 0 00 0 1 0 0 00 2 0 3 0 00 0 0 0 0 0*///声明一个二维数组,表示有4行6列,默认值都为0var arr [4][6]intfmt.Println(arr) //输出[[0 0 0 0 0 0] [0 0 0 0 0 0] [0 0 0 0 0 0] [0 0 0 0 0 0]]//赋初始值arr[1][2] = 1arr[2][1] = 2arr[2][3] = 3fmt.Println(arr)//遍历二维数组,按照要求输出图形for i := 0; i < 4; i++ {for j := 0; j < 6; j++ {fmt.Print(arr[i][j], " ")}fmt.Println()}
    }
    

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

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

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

使用演示

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

 //二维数组在内存的布局var arr2 [2][3]int //以这个为例来分析arr2在内存的布局arr2[1][1] = 10fmt.Println(arr2)fmt.Printf("arr[0]的地址是%p\n", &arr2[0])fmt.Printf("arr[1]的地址是%p\n", &arr2[1])

5.使用方式2:直接初始化

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

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

  • 使用演示:

 var arr3 [2][3]int = [2][3]int{{1, 2, 3}, {4, 5, 6}}fmt.Println("arr3=", arr3)
  • 说明:二维数组在声明/定义时也对应有四种写法[和一维数组类似]

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

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

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

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

6.二维数组的遍历

  • 双层for 循环完成遍历

  • for-range 方式完成遍历

    案例演示:

    func main() {//演示二维数组的遍历var arr3 [2][3]int = [2][3]int{{1, 2, 3}, {4, 5, 6}}//for循环遍历for i := 0; i < len(arr3); i++ { //len(arr3) = 2for j := 0; j < len(arr3[i]); j++ {fmt.Printf("%v\t", arr3[i][j])}fmt.Println()}//for-range来遍历for i, v := range arr3 {for i2, v2 := range v {fmt.Printf("arr[%v][%v]=%v \t", i, i2, v2)}fmt.Println()}
    }
    

7.二维数组的应用案例

  • 要求如下:

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

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

  • 代码

    func main() {//定义二维数组,用于保存三个班,每个班五名同学成绩,//并求出每个班级平均分、以及所有班级平均分//1.定义一个二维数组var scores [3][5]float64for i := 0; i < len(scores); i++ { //len(scores)有3个下标for j := 0; j < len(scores[i]); j++ { //len(scores[0])有5个下标fmt.Printf("请输入第%d班的第%d个学校成绩\n", i+1, j+1)fmt.Scanln(&scores[i][j])}}fmt.Println(scores)totalSum := 0.0 //定义一个变量,用户累计所有班级的总分//遍历结果for i := 0; i < len(scores); i++ {sum := 0.0 //定义一个变量,用于累计各个班级的总分for j := 0; j < len(scores[i]); j++ {sum += scores[i][j]}totalSum += sumfmt.Printf("第%d班级的总分为%v,平均分为%v\n", i+1, sum, sum/float64(len(scores[i])))}fmt.Printf("所有班级的总分为%v,所有班级平均分为%v\n", totalSum, totalSum/15)
    }
    

8.练习

题目1

随机生成10个整数(1_ 100 的范围)保存到数组,并倒序打印以及求平均值、求最大值和最大值的下标、并查找里面是否有55

题目2
已知有个排序好(升序) 的数组,要求插入一个元素,最后打印该数组,顺序依然是升序

题目3
定义一个3行4列的二维数组,逐个从键盘输入值,编写程序将四周的数据清0

题目4
定义一个4行4列的二维数组,逐个从键盘输入值,然后将第1行和第4行的数据进行交换,
将第2行和第3行的数据进行交换

题目5
试保存13579五个奇数到数组,并倒序打印

题目6
试写出实现查找的核心代码,比如已知数组arr [10]string;里面保存了十个元素,现要查找
“AA"在其中是否存在,打印提示, 如果有多个"AA”,也要找到对应的下标。

题目7
随机生成10个整数(1-100之间),使用冒泡排序法进行排序,然后使用二分查找法,查找是
否有90这个数,并显示下标,如果没有则提示“找不到该数”

题目8
编写-个函数,可以接收- -个数组,该数组有5个数,请找出最大的数和最小的数和对应的
数组下标是多少?

题目9
定义一个数组,并给出8个整数,求该数组中大于平均值的数的个数,和小于平均值的数的
个数。.

题目10

跳水比赛,8个评委打分。运动员的成绩是8个成绩取掉一一个最高分, 去掉一一个最低分,剩
下的6个分数的平均分就是最后得分。使用- -维数组实现如下功能:

(1)请把打最高分的评委和最低分的评委找出来。

(2)找出最佳评委和最差评委。最佳评委就是打分和最后得分最接近的评委。最差评委就是打分和最后得分相差最大的。

【Golang第6章:排序和查找】golang怎么排序,golang的顺序查找和二分查找,go语言中顺序查找二分查找介绍和案例相关推荐

  1. 【Golang第8章:面向对象编程】Go语言的结构体是什么,怎么声明;Golang方法的调用和声明;go语言面向对象实例,go语言工厂模式;golang面向对象的三大特性:继承、封装、多态

    介绍 这个是在B站上看边看视频边做的笔记,这一章是Glang面向对象编程 这一章内容较多,内容有Go语言的结构体是什么,怎么声明:Golang方法的调用和声明:go语言面向对象实例,go语言工厂模式: ...

  2. C语言用函数字符串的查找,字符串查找函数,C语言字符串查找函数详解

    在对 C 语言的编程实践中,字符串查找是最频繁的字符串操作之一,本节就对常用的字符串查找函数做一个简单的总结. 使用 strchr 与 strrchr 函数查找单个字符如果需要对字符串中的单个字符进行 ...

  3. 用Golang写一个搜索引擎(0x05)--- 文本相关性排序

    上面我们已经说过了一些倒排索引的东西,并且也知道了如何来实现一个倒排索引完成检索功能,那么检索完了以后如何排序呢,这一篇简单的说一下倒排索引的文本相关性排序,因为排序实在是太复杂了,我们这里就说说文本 ...

  4. 非零基础自学Golang 第17章 HTTP编程(上) 17.3 爬虫框架gocolly 17.3.1 gocolly简介

    非零基础自学Golang 文章目录 非零基础自学Golang 第17章 HTTP编程(上) 17.3 爬虫框架gocolly 17.3.1 gocolly简介 第17章 HTTP编程(上) 17.3 ...

  5. 自学golang【第一章:go语言基础知识】为什么要学习go语言?go语言与c语言的关系?go语言创始人?go语言的特性有哪些?go语言适合做什么?国内外有哪些企业或项目使用go语言?

    事先声明:本文部分内容参考了尹成的笔记,如果侵权请联系删除. 我是一名自学go语言的初学者,从今天开始我将会坚持更新go语言的相关知识,从入门到精通,如果大家有什么需要可以加我QQ:239479969 ...

  6. 非零基础自学Golang 第18章 HTTP编程(下) 18.2 HTTP服务端 18.2.2 启动HTTP服务器 18.2.3 启动HTTPS服务器

    非零基础自学Golang 文章目录 非零基础自学Golang 第18章 HTTP编程(下) 18.2 HTTP服务端 18.2.2 启动HTTP服务器 18.2.3 启动HTTPS服务器 第18章 H ...

  7. 非零基础自学Golang 第3章 基本变量与类型 3.1 Go语言变量

    非零基础自学Golang 文章目录 非零基础自学Golang 第3章 基本变量与类型 3.1 Go语言变量 3.1.1 声明变量 3.1.2 初始化变量 3.1.3 变量值交换 3.1.4 匿名变量 ...

  8. 非零基础自学Golang 第15章 Go命令行工具 15.4 注释文档(doc)

    非零基础自学Golang 文章目录 非零基础自学Golang 第15章 Go命令行工具 15.4 注释文档(doc) 第15章 Go命令行工具 15.4 注释文档(doc) Go语言文档工具go do ...

  9. 大话数据结构读书笔记艾提拉总结 查找算法 和排序算法比较好 第1章数据结构绪论 1 第2章算法 17 第3章线性表 41 第4章栈与队列 87 第5章串 123 第6章树 149 第7章图 21

    大话数据结构读书笔记艾提拉总结 查找算法 和排序算法比较好 第1章数据结构绪论 1 第2章算法 17 第3章线性表 41 第4章栈与队列 87 第5章串 123 第6章树 149 第7章图 211 第 ...

最新文章

  1. 【点云论文速读】6D位姿估计
  2. pytorch学习笔记(二):gradien
  3. Crontab命令格式
  4. Android App退出检测
  5. xil_printf打印遇到的问题
  6. Flask框架(flask中的蓝图Blueprint)
  7. 在win10系统下怎样快速切换任务视图
  8. 二分查找算法java
  9. java或异运算_java中与运算,或运算,异或运算,取反运算
  10. mysql en dump_mysqldump 命令总结
  11. 搭建Android/Linux驱动编译开发环境篇
  12. aspUpload有组件上传文件
  13. 系统等保指的是信息系统的安全保护等级
  14. elementui表格鼠标滑轮控制横向滚动
  15. rn 滑动验证_rn-fetch-blob
  16. Win10 打印时提示 “发现您尚未安装打印机”
  17. 计算机毕业设计 SSM+Vue宠物管理系统 宠物商城 宠物用品购物平台 宠物领养救助系统 Java Vue MySQL数据库 远程调试 代码讲解
  18. GNN学习笔记(四):图注意力神经网络(GAT)节点分类任务实现
  19. 贝叶斯网与链式法则的理解
  20. 35岁被大厂踢出豪门,褪去这层皮你还剩什么

热门文章

  1. 鸿蒙系统手机一览表,四款华为鸿蒙系统手机推荐,后续可直接升级鸿蒙2.0
  2. 英语语法回顾3——名词和名词性从句
  3. 将一颗树反转为其镜像
  4. 手机淘宝客户端架构探索实践
  5. 海康摄像头的ISAPI协议
  6. Element 根据勾选导出Excel表格数据
  7. java语言学术报告厅,文理学院举办java编程语言公开课
  8. Excel中的LEN和LENB,VBA中的Len和LenB
  9. CANopen协议学习
  10. 知乎上演的“变形计“,资本市场会打几分?