GO语言学习之排序和查找
1.排序的基本介绍
排序是将一组数据,依照指定的顺序进行排列的过程
排序分类:
1》内部排序:
指将需要处理的所有数据都加载到内部存储器中进行排序
包括(交换式排序法,选择式排序法,插入式排序法)
2》外部排序法:
数据量过大,无法加载到内存中,需要借助外部村粗进行排序
包括:(合并排序法和直接合并排序法)
2.冒泡排序
图解暂时省略:
/*
// 3,2,6,7,1 //从小到大排列
//第一轮: 第一次:2,3,6,7,1 3和 2比较大的放后面
第二次:2,3,6,7,1
第三次:2,3,6,7,1
第四次:2,3,6,1,7
第二轮: 第一次:2,3,6,1,7
第二次:2,3,6,1,7
第三次:2,3,1,6,7
第三轮: 第一次:2,3,1,6,7
第二次:2,1,3,6,7
第四轮: 第一次:1,2,3,6,7
*/
}
3.代码示例:
var arr [5]int=[...]int{3,2,6,7,1}
//观察得出结论,外层控制比较轮数,内层控制比较次数 轮数+次数=len
for i:=1;i<len(arr);i++{
for j:=0;j<len(arr)-i;j++{
if arr[j]>arr[j+1]{
var temp int=arr[j+1]
arr[j+1]=arr[j]
arr[j]=temp
}
}
}
fmt.Println(arr)
4.查找
GO中常用查找有:
顺序查找
二分查找(有序数组)
找对象:有一个数列:西施,貂蝉,玉环,昭君,陈圆圆,李师师,柳如是
在键盘中任意输入一个名称,判断数列中是否包含此名称
laoPo:=[7]string{"西施","貂蝉","玉环","昭君","陈圆圆","李师师","柳如是"}
var name=""
fmt.Println("请输入要查找的名字:")
fmt.Scanln(&name)
//顺序查找
for i:=0;i<len(laoPo);i++{
if name==laoPo[i]{
fmt.Println("找到%v,下表为:%v",laoPo[i],i)
break
}else if i==(len(name)-1) {
fmt.Println("没有找到%v",name)
}
}
//第二种方式
index:=-1
for i:=0;i<len(laoPo);i++{
if name==laoPo[i]{
index=i
}
}
if index!=-1{
fmt.Printf("找到%v,下标为%v",laoPo[index],index)
}else {
fmt.Println("没有找到%v",name)
}
//二分查找
arr:=[6]int{2,3,4,5,6,7}
start:=0
end:=len(arr)
//
var num int
fmt.Println("输入一个数字:")
fmt.Scanln(&num)
for i:=0;i<(len(arr)+1)/2;i++{
middle:=(start+end)/2
if start>=end{
fmt.Println("不存在")
return
}
if num>arr[middle]{
start=middle
}else if num<arr[middle]{
end=middle
}else {
fmt.Println("找到了")
fmt.Printf("num的下标为:%v",middle)
}
}
5.二维数组
多维数组我们在开发过程中,最多用个二维数组,比如:五子棋棋盘
//二维数组输出
/*
0 3 0 0 0 0
0 0 1 0 0 0
0 0 0 2 0 0
0 0 0 0 0 0
*/
var arr[4][6]int
arr[0][1]=3
arr[1][2]=1
arr[2][3]=2
for i:=0;i<4;i++{
for j:=0;j<6;j++{
fmt.Print(arr[i][j]," ")
}
fmt.Println()
}
6.使用方式1:先声明/定义,再赋值
语法:var 数组名【大小】【大小】类型
比如:var arr【2】【3】int,再赋值
使用演示
二维数组在内存的存在形式(重点)
var arr[2][3]int
arr[0][1]=10
fmt.Println(arr)
fmt.Printf("arr[0]的地址为%p\n",&arr[0])
fmt.Printf("arr[0][0]的地址为%p\n",&arr[0][0])
fmt.Printf("arr[1]的地址为%p\n",&arr[1])
fmt.Printf("arr[0][1]的地址为%p\n",&arr[0][1])
/*
[[0 10 0] [0 0 0]]
arr[0]的地址为0xc00008c030
arr[0][0]的地址为0xc00008c030
arr[1]的地址为0xc00008c048
arr[0][1]的地址为0xc00008c038
*/
7.使用方式2:直接初始化
声明:var 数组名【大小】【大小】类型=【大小】【大小】类型{{初值},{初值}。。。}
赋值(有默认值,比如Int 类型的就是0)
使用演示
fmt.Println()
var arr[2][3]int=[2][3]int{{1,2,3},{5,2,0}}
fmt.Println(arr)
二维数组在声明/定义时也有对应的四种写法【和一维数组相似】
var 数组名【大小】【大小】类型=【大小】【大小】类型{{初值},{初值}。。。}
var 数组名【大小】【大小】类型=【。。。】【大小】类型{{初值},{初值}。。。}
var 数组名=【大小】【大小】类型{{初值},{初值}。。。}
var 数组名=【。。。】【大小】类型{{初值},{初值}。。。}
8.二维数组的遍历
//双层for循环遍历
var arr =[2][3]int{{1,2,3},{6,7,8}}
//for循环遍历
for i:=0;i<len(arr);i++{
for j:=0;j<len(arr[i]);j++{
fmt.Printf("%v\t",arr[i][j])
}
fmt.Println()
}
//for-range遍历
for i,v:=range arr{
for j,v2:=range v{
fmt.Printf("arr[%v][%v]=%v \t",i,j,v2)
}
fmt.Println()
}
9.二维数组的应用
要求:定义二维数组,用于保存三个班,每个班五名同学成绩
并求出每个班级平均分,以及所有班级的平均分
//定义一个二维数组
var score[3][5]float64
//循环插入成绩·
for i:=0;i<len(score);i++{
for j:=0;j<len(score[i]);j++{
fmt.Printf("请输入第%d班的第%d同学的成绩\n",i+1,j+1)
fmt.Scanln(&score[i][j])
}
}
//遍历输出成绩后的二维数组,统计平均分
total:=0.0//用于累计各个班级的总分
for i:=0;i<len(score);i++{
sum:=0.0//定义一个变量,用于累计各个班级的总分
for j:=0;j<len(score[i]);j++{
sum+=score[i][j]
}
total+=sum
fmt.Printf("第%d班级的总分为%v,平均分为%v,\n",i+1,sum,sum/float64(len(score[i])))
}
fmt.Printf("所有班级总分wei%v,平均分为 %v",total,total/15)