Golang排序和查找
Posted 2019ab
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Golang排序和查找相关的知识,希望对你有一定的参考价值。
排序的介绍
排序是将一组数据,依指定的顺序进行排列的过程。
排序的分类:
1.内部排序:
指将需要处理的所有数据都加载到内部存储器中进行排序。
包括(交换式排序法,选择式排序法和插入式排序法);
2.外部排序法
数据量过大,无法全部加载到内存中,需要借助外部存储进行排序。包括(合并排序法和直接合并排序法)。
交换式排序法
交换式排序属于内部排序法,是运用数据值比较后,依判断规则对数据位置进行交换,以达到排序的目的。
交换排序法又可分为两种:1.冒泡排序法(Bubble sort)2.快速排序法(Quick sort)
交换式排序法-冒泡排序法
冒泡排序(Bubble Sorting)的基本思想是:通过对待排序序列从后向前(从下标较大的元素开始),依次比较相邻元素的排序码,若发现逆序则交换,使排序码较小的元素逐渐从后部移向前部(从下标较大的单位移向下标较小的单元),就像水底下的气泡一样逐渐向上冒。
因为排序的过程中,各元素不断接近自己的位置,如果一趟比较下来没有进行过交换,就说明序列有序,因此要在排序过程中设置一个标志flag判断是否进行过交换。从而减少不必要的比较(优化)。
// 冒泡排序
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.Println("排序后arr=",(*arr))
查找
//顺序查找:方式一
for i := 0;i<len(names);i++
if heroName == names[i]
fmt.Printf("找到%v,下标%v \\n",heroName,i)
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
if index != -1
fmt.Printf("找到%v,下标%v \\n",heroName,index)
else
fmt.Println("没有找到",heroName)
二分查找代码实现
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
// 说明我们要查找的数,应该在 middle+1 --- rightIndex
BinaryFind(arr,leftIndex,middle-1,findVal)
else
// 找到了
fmt.Printf("找到了,下标为%v \\n",middle)
二维数组的介绍
多维数组我们只介绍二维数组
二维数组的应用场景
比如我们开发一个五子棋游戏,棋盘就是需要二维数组来表示。
二维数组快速入门
快速入门案例:
请使用二维数组输出如下图形
func main()
// 定义、声明一个数组
var arr [4][6]int
// 赋初值
arr[1][2]=1
arr[2][1]=2
arr[2][3]=3
// 遍历二维数组,按照要求输出图形
for i :=0;i<4;i++
for j:=0;j<6;j++
fmt.Print(arr[i][j],"")
fmt.Println()
使用方法1:先声明/定义,再赋值
1.语法:var 数组名 【大小】【大小】类型
2.比如:var arr [2][3]int,再赋值
3.使用演示
4.二维数组在内存中存在形式
使用方式2:直接初始化
声明:var 数组名【大小】【大小】类型 = 【大小】【大小】类型初始值…,初始值…
赋值(有默认值,比如int 类型的就是0)
使用演示:
var arr3 [2][3]int = [2][3]int1,2,3,4,5,6
fmt.Println("arr3=",arr3)
二维数组的使用
二维数组的遍历
- 双层for循环完成遍历
func main()
// 演示二维数组的遍历
var arr3 = [2][3]int1,2,3,4,5,6
// for循环来遍历
for i := 0;i<len(arr3);i++
for j:=0;j<len(arr3[i];j++)
fmt.Printf("%v\\t",arr3[i][j])
fmt.Println()
// for-range来遍历二维数组
for i,v := range arr3
for j,v2 := range v
fmt.Printf("arr3[%v][%v]=%v \\t",i,j,v2)
fmt.Println()
- for-range方式完成遍历
func main()
// 演示二维数组的遍历
var arr3 = [2][3]int1,2,3,4,5,6
// for循环来遍历
for i := 0;i<len(arr3);i++
for j:=0;j<len(arr3[i];j++)
fmt.Printf("%v\\t",arr3[i][j])
fmt.Println()
// for-range来遍历二维数组
for i,v := range arr3
for j,v2 := range v
fmt.Printf("arr3[%v][%v]=%v \\t",i,j,v2)
fmt.Println()
二维数组的应用案例
定义二维数组,用于保存三个班,每个班五名同学成绩,求出每个班级平均分,以及所有班级平均分
func main()
// 定义一个二维数组
var scores [3][5]float64
// 循环的输入成绩
for i:=0;i<len(scores);i++
for j:=0;j<len(scores[i]);j++
fmt.Printf("请输入第%d班的第%d个学生的成绩\\n",i+1,j+1)
fmt.Scanln(&scores[i][j])
// 遍历输出成绩后的二维数组,统计平均分
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 += sum
fmt.Printf("第%d班级的总分为%v,平均分为%v\\n",i+1,sum,sum/float64(len(scores[i])))
fmt.Printf("所有班级的总分为%v,所有班级的平均分为%v\\n",totalSum ,totalSum/15)
感谢大家观看,我们下期见
以上是关于Golang排序和查找的主要内容,如果未能解决你的问题,请参考以下文章