Golang 排序与查找算法实现及二维数组应用详解

陈默
陈默
发布时间:2026-10-15 | 6人浏览过
原创

本文详细解析 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 数组名 [行大小][列大小]类型

  1. 先声明后赋值:定义变量后再对特定索引进行赋值。
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. 直接初始化:在声明时直接赋予初始值列表,未赋值的元素默认为该类型的零值(如 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 语言基础与进阶教程的资料,请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表