GO语言学习之排序和查找

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)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值