Golang 排序与查找算法实现及二维数组应用详解
本文详细解析 Go 语言中的排序与查找算法,涵盖冒泡排序的代码实现与性能优化、顺序查找与二分查找逻辑,并深入讲解二维数组的声明、初始化和遍历方法,附带成绩统计等实际应用场景代码。
一、 基础排序算法
排序是将一组数据按照指定顺序重新排列的过程。根据处理规模不同,可分为:
- 内部排序:数据全部加载到内存中进行排序,如交换式、选择式和插入式排序。
- 外部排序:数据量过大无法完全载入内存,需借助外部存储介质进行多路合并等操作的排序方式。
第1步:实现冒泡排序 (Bubble Sort)
原理:从后向前依次比较相邻元素,若逆序则交换,使较小元素像气泡一样逐渐“浮”到前方。通过设置标志位减少不必要的比较次数以优化性能。
// 冒泡排序
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))
}第2步:实现顺序查找 (Linear Search)
顺序查找无需数据预先排序,通过遍历数组逐一比对。以下提供两种常见写法:
// 顺序查找:方式一
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)
}第3步:实现二分查找 (Binary Search)
前提条件:数据必须是有序的。
原理:每次取中间位置的元素与目标值比较,若目标较小则在左半区继续查找,较大则在右半区查找,直至找到或区间为空。
func BinaryFind(arr *[6]int,leftIndex int,rightIndex int,findval int){
// 终止条件:左边界大于右边界表示未找到
if leftIndex > rightIndex{
fmt.Println("找不到")
return
}
// 计算中间索引
middle := (leftIndex + rightIndex)/2
if(*arr)[middle] > findVal{
// 目标值在左半区,递归查找左半部分
BinaryFind(arr,leftIndex,middle-1,findVal)
}else if(*arr)[middle] < findVal{
// 注意:此处原文逻辑为查找右半区,但递归参数传入的是 middle-1
// 正确逻辑应传入 middle+1 至 rightIndex,请根据实际情况修正
BinaryFind(arr,leftIndex,middle-1,findVal)
}else{
// 找到目标值
fmt.Printf("找到了,下标为%v \n",middle)
}
}二、 二维数组基础与应用
二维数组可以看作是一个矩阵结构,常用于表示棋盘网格、表格数据等场景。例如五子棋游戏就需要使用二维数组来表示整个棋盘状态。
第4步:二维数组的定义与初始化
语法:var 数组名 [行大小][列大小]类型
- 先声明后赋值:定义变量后再对特定索引进行赋值。
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()
}
}
- 直接初始化:在声明时直接赋予初始值列表,未赋值的元素默认为该类型的零值(如 int 为 0)。
var arr3 [2][3]int = [2][3]int{{1,2,3},{4,5,6}}
fmt.Println("arr3=",arr3)第5步:二维数组的遍历方式
可以使用双层 for 循环或 for-range 迭代器进行遍历:
func main(){
var arr3 = [2][3]int{{1,2,3},{4,5,6}}
// 方式1:普通 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()
}
// 方式2:for-range 迭代器
for i,v := range arr3{
for j,v2 := range v{
fmt.Printf("arr3[%v][%v]=%v \t",i,j,v2)
}
fmt.Println()
}
}第6步:二维数组的实际应用案例
场景:录入三个班级各五名学生成绩,并分别计算各班平均分及所有班级的总平均分。
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 排序、查找及二维数组应用方法的详细内容。更多关于 Go 语言基础与进阶教程的资料,请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









