脚本之家,脚本语言编程技术及教程分享平台!
分类导航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|shell|

服务器之家 - 脚本之家 - Golang - Golang排序和查找使用方法介绍

Golang排序和查找使用方法介绍

2022-12-19 16:092019ab Golang

排序操作和查找一样是很多程序经常使用的操作。尽管一个最短的快排程序只要15行就可以搞定,但是一个健壮的实现需要更多的代码,并且我们不希望每次我们需要的时候都重写或者拷贝这些代码

排序的介绍

排序是将一组数据,依指定的顺序进行排列的过程。

排序的分类:

1.内部排序:

指将需要处理的所有数据都加载到内部存储器中进行排序。

包括(交换式排序法,选择式排序法和插入式排序法);

2.外部排序法

数据量过大,无法全部加载到内存中,需要借助外部存储进行排序。包括(合并排序法和直接合并排序法)。

交换式排序法

交换式排序属于内部排序法,是运用数据值比较后,依判断规则对数据位置进行交换,以达到排序的目的。

交换排序法又可分为两种:

1.冒泡排序法(Bubble sort)

2.快速排序法(Quick sort)

交换式排序法-冒泡排序法

冒泡排序(Bubble Sorting)的基本思想是:通过对待排序序列从后向前(从下标较大的元素开始),依次比较相邻元素的排序码,若发现逆序则交换,使排序码较小的元素逐渐从后部移向前部(从下标较大的单位移向下标较小的单元),就像水底下的气泡一样逐渐向上冒。

因为排序的过程中,各元素不断接近自己的位置,如果一趟比较下来没有进行过交换,就说明序列有序,因此要在排序过程中设置一个标志flag判断是否进行过交换。从而减少不必要的比较(优化)。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// 冒泡排序
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))
}

查找

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//顺序查找:方式一
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)
}

二分查找代码实现

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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)
    }
}

二维数组的介绍

多维数组我们只介绍二维数组

二维数组的应用场景

比如我们开发一个五子棋游戏,棋盘就是需要二维数组来表示。

二维数组快速入门

快速入门案例:

请使用二维数组输出如下图形

Golang排序和查找使用方法介绍

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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.二维数组在内存中存在形式

Golang排序和查找使用方法介绍

使用方式2:直接初始化

声明:var 数组名【大小】【大小】类型 = 【大小】【大小】类型{{初始值…},{初始值…}}

赋值(有默认值,比如int 类型的就是0)

使用演示:

?
1
2
var arr3 [2][3]int = [2][3]int{{1,2,3},{4,5,6}}
fmt.Println("arr3=",arr3)

二维数组的使用

二维数组的遍历

双层for循环完成遍历

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
func main(){
 // 演示二维数组的遍历
 var arr3 = [2][3]int{{1,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方式完成遍历

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
func main(){
 // 演示二维数组的遍历
 var arr3 = [2][3]int{{1,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()
  }
}

二维数组的应用案例

定义二维数组,用于保存三个班,每个班五名同学成绩,求出每个班级平均分,以及所有班级平均分

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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排序和查找使用方法介绍的文章就介绍到这了,更多相关Golang排序和查找内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/ab15176142633/article/details/127240522

延伸 · 阅读

精彩推荐
  • GolangGo语言开发编程规范命令风格代码格式

    Go语言开发编程规范命令风格代码格式

    这篇文章主要为大家介绍了Go语言开发编程规范命令风格代码格式,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪...

    王中阳Go9462022-10-19
  • GolangGo 中的空白标识符下划线

    Go 中的空白标识符下划线

    这篇文章主要介绍了Go 中的空白标识符下划线,空白标识符是未使用的值的占位符,由下划线(_)表示,下文对其相关介绍需要的小伙伴可以参考一下...

    宇宙之一粟10502022-09-12
  • GolangGo 1.18 Beta 1 可用,带有泛型

    Go 1.18 Beta 1 可用,带有泛型

    Go 1.18 Beta 1 现已可用,这是 Go 1.18 的第一个预览版;Go 1.18 的正式版发布还需要几个月的时间。...

    开源中国10672021-12-15
  • GolangGo 代码生成工具详解

    Go 代码生成工具详解

    这篇文章主要介绍了Go 代码生成工具详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...

    新亮笔记4932021-04-18
  • GolangGo语言通过Luhn算法验证信用卡卡号是否有效的方法

    Go语言通过Luhn算法验证信用卡卡号是否有效的方法

    这篇文章主要介绍了Go语言通过Luhn算法验证信用卡卡号是否有效的方法,实例分析了Luhn算法的原理与验证卡号的使用技巧,需要的朋友可以参考下 ...

    heishui4602020-04-21
  • Golang详解Go语言设计模式之单例模式

    详解Go语言设计模式之单例模式

    单例模式很容易记住。就像名称一样,它只能提供对象的单一实例,保证一个类只有一个实例,并提供一个全局访问该实例的方法。本文就来聊聊Go语言中...

    宇宙之一粟9402022-11-29
  • Golanggolang websocket 服务端的实现

    golang websocket 服务端的实现

    这篇文章主要介绍了golang websocket 服务端的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面...

    小柒的另一个世界4252020-05-27
  • Golanggo语言实现二叉树的序例化与反序列化

    go语言实现二叉树的序例化与反序列化

    这篇文章主要介绍了go语言实现二叉树的序例化与反序列化,文章围绕主题展开详细内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下...

    呆呆灿12042022-10-09