go排序查找、二维数组
排序介绍
排序是将一群数据,依照指定的顺序进行排序的过程
1)内部排序:指将需要处理的所有数据都加载到内部存储器中进行排序。包括(交换式排序法、选择式排序法和插入式排序法)
2)外部排序:数据量过大,无法全部加载到内部中,需要借助外部存储进行排序。包括(合并排序法和直接合并排序法)
交换排序属于内部排序法,就是运用数据值比较后,依据判断规则对数据位置进行交换,以达到排序目的
交换排序又可以分为两种:冒泡排序、快速排序
冒泡排序:通过对待排序序列从后向前,依次比较相邻元素的排序码,若发现逆序,使排序码较小的元素逐渐从后部移向前部(从下标较大的单元移向下标较小的单元),就像水底的气泡一样逐渐向上冒;因为排序的过程中,各个元素不断接近自己的位置。如果一趟下来没有进行过交换,就说明序列有序,依次要在排序过程中设置一个标志flag判断元素是否进行交换。从而减少不必要的比较

示例
package main
import(
"fmt"
)
func b (n *[5]int) [5]int{
for x:= len((*n))-1;x >1;x--{
for i := 0; i<x ;i++{
if (*n)[i] > (*n)[i+1]{
(*n)[i],(*n)[i+1]=(*n)[i+1],(*n)[i]
}
}
}
return *n
}
func c (n *[5]int) [5]int{
for i:=0;i<len(*n)-1;i++{
for x:=0; x <len(*n)-1-i;x++{
if (*n)[x] > (*n)[x+1]{
(*n)[x],(*n)[x+1]=(*n)[x+1],(*n)[x]
}
}
}
return *n
}
func main(){
a := [5]int{23,56,98,53,24}
fmt.Println(a)
for i :=len(a)-1; i > 1 ;i--{
for x:=0; x < i ;x++{
if a[x]> a[x+1]{
a[x],a[x+1]=a[x+1],a[x]
}
}
fmt.Println("小圈打印交换后",a)
}
fmt.Println("处理",a)
a1 := [5]int{23,56,98,53,24}
fmt.Println("a1,操作前",a1)
//a1 = b(&a1)
b(&a1)
fmt.Println("a1=",a1)
a2 := [5]int{23,56,98,53,24}
fmt.Println("a2=",a2)
c(&a2)
fmt.Println("a2=",a2)
}
// 执行结果
// PS D:\golang\goproject\src\src01\go_code\src> go run chapter07\demo01\main.go
// [23 56 98 53 24]
// 小圈打印交换后 [23 56 53 24 98]
// 小圈打印交换后 [23 53 24 56 98]
// 小圈打印交换后 [23 24 53 56 98]
// 处理 [23 24 53 56 98]
// a1,操作前 [23 56 98 53 24]
// a1= [23 24 53 56 98]
// a2= [23 56 98 53 24]
// a2= [23 24 53 56 98]
查找法
在golang中。常用的查找法有两种顺序查找;二分查找(该数组必须是有序的)
顺序查找法
package main
import (
"fmt"
)
func main(){
var name string
names := [4]string{"白眉鹰王","金毛狮王","青翼蝠王","紫衫龙王"}
fmt.Println("输入名字")
fmt.Scanln(&name)
//顺序查找:第一种方式
// for i:=0; i<len(names);i++{
// if name == names[i]{
// fmt.Printf("找到%v,下标%v\n",name,i)
// break
// }else if i == len(names)-1{
// fmt.Println("没有找到",name)
// }
// }
// for i,v:=range names{
// if name ==v {
// fmt.Printf("找到%v,下标%v\n",name,i)
// break
// } else if i == len(names)-1{
// fmt.Println("没有找到",name)
// }
// }
index := -1
for i,v:=range names{
if name== v{
index= i
break
}
}
if index>=0{
fmt.Printf("找到了%v,下标是%v",names[index],index)
}
}
// 执行方式
// PS D:\golang\goproject\src\src01\go_code\src> go run chapter07\demo02\main.go
// 输入名字
// 杨逍
// 没有找到 杨逍
// PS D:\golang\goproject\src\src01\go_code\src> go run chapter07\demo02\main.go
// 输入名字
// 紫衫龙王
// 找到紫衫龙王,下标3
// PS D:\golang\goproject\src\src01\go_code\src> go run chapter07\demo02\main.go
// 输入名字
// 张无忌
// 没有找到 张无忌
// PS D:\golang\goproject\src\src01\go_code\src> go run chapter07\demo02\main.go
// 输入名字
// 青翼蝠王
// 找到青翼蝠王,下标2
// 没有找到 青翼蝠王
// PS D:\golang\goproject\src\src01\go_code\src> go run chapter07\demo02\main.go
// 输入名字
// 青翼蝠王
// 找到青翼蝠王,下标2
// 没有找到 青翼蝠王
// PS D:\golang\goproject\src\src01\go_code\src> go run chapter07\demo02\main.go
// 输入名字
// 2
// 没有找到 2
// PS D:\golang\goproject\src\src01\go_code\src> go run chapter07\demo02\main.go
// 输入名字
// 没有找到
// PS D:\golang\goproject\src\src01\go_code\src> go run chapter07\demo02\main.go
// 输入名字
// 青翼蝠王
// 找到青翼蝠王,下标2
// PS D:\golang\goproject\src\src01\go_code\src> go run chapter07\demo02\main.go
// 输入名字
// 紫衫龙王
// 找到紫衫龙王,下标3
// PS D:\golang\goproject\src\src01\go_code\src> go run chapter07\demo02\main.go
// 输入名字
// 紫衫龙王
// 找到了紫衫龙王,下标是3
// PS D:\golang\goproject\src\src01\go_code\src> go run chapter07\demo02\main.go
// 输入名字
// 白眉鹰王
// 找到了白眉鹰王,下标是0
二分查找
思路分析

代码实现
package main
import (
"fmt"
)
func BinaryFind(arr *[10]int,leftIndex int,rightIndex int, find int) {
if leftIndex > rightIndex {
fmt.Println("不存在")
return
}
middle:=(leftIndex+rightIndex)/2
if (*arr)[middle] >find{
//说明 find的取值范围在左边。left---middel-1
BinaryFind(arr,leftIndex,middle-1,find)
}else if (*arr)[middle]<find{
//说明 find的取值范围在左边
BinaryFind(arr,middle+1,rightIndex,find)
} else {
fmt.Printf("找到了下标为%v",middle)
}
}
func main(){
var s [10]int = [10]int {10,15,23,28,38,45,55,67,79,89}
var r int
fmt.Println("输入一个数字")
fmt.Scanln(&r)
BinaryFind(&s,0,len(s)-1,r)
}
// 执行结果
// PS D:\golang\goproject\src\src01\go_code\src> go run chapter07\demo03\main.go
// 输入一个数字
// 76
// 不存在
// PS D:\golang\goproject\src\src01\go_code\src> go run chapter07\demo03\main.go
// 输入一个数字
// 38
// 找到了下标为4
二维数组
示例
package main
import (
"fmt"
)
func main(){
var t [4][6]int
label1:
for i,_:= range t{
for s,_:= range t[i]{
if i==1 && s==2 {
t[i][s]=1
}else if i ==2 && s ==1{
t[i][s]=2
}else if i ==2 && s ==3{
t[i][s]=3
//y = 1
break label1
}
}
}
for i,_:=range t{
for _,v:=range t[i]{
fmt.Printf("%v ",v)
}
fmt.Println()
}
}
// 执行结果
// PS D:\golang\goproject\src\src01\go_code\src> go run chapter07\demo04\main.go
// 0 0 0 0 0 0
// 0 0 1 0 0 0
// 0 2 0 3 0 0
// 0 0 0 0 0 0
方法2
package main
import (
"fmt"
)
func main(){
var t [4][6]int
for i,_:= range t{
for s,v:= range t[i]{
if i==1 && s==2 {
v=1
}else if i ==2 && s ==1{
v=2
}else if i ==2 && s ==3{
v=3
}
fmt.Printf("%v ",v)
}
fmt.Println()
}
}
// 执行结果
// PS D:\golang\goproject\src\src01\go_code\src> go run chapter07\demo04\main.go
// 0 0 0 0 0 0
// 0 0 1 0 0 0
// 0 2 0 3 0 0
// 0 0 0 0 0 0
内存分析与代码
package main
import (
"fmt"
)
func main(){
var arr2 [2][3]int
fmt.Printf("arr2[0]的地址值%p\n",&arr2[0])
fmt.Printf("arr2[1]的地址值%p\n",&arr2[1])
fmt.Printf("arr2[0][0]的地址值%p\n",&arr2[0][0])
fmt.Printf("arr2[1][0]的地址值%p\n",&arr2[1][0])
}
// 执行结果
// PS D:\golang\goproject\src\src01\go_code\src> go run chapter07\demo04\main.go
// arr2[0]的地址值0xc00000e360
// arr2[1]的地址值0xc00000e378
// arr2[0][0]的地址值0xc00000e360
// arr2[1][0]的地址值0xc00000e378
分析图

二维数组使用方式,直接初始化
package main
import (
"fmt"
)
func main(){
arr3 := [2][2]int {{1,3},{6,9}}
fmt.Println("arr3=",arr3)
//初始化时就赋值
var arr4 = [2][2]int {{1,5},{2,7}}
fmt.Println("arr4=",arr4)
}
// 执行结果
// PS D:\golang\goproject\src\src01\go_code\src> go run chapter07\demo04\main.go
// arr3= [[1 3] [6 9]]
// arr4= [[1 5] [2 7]]
二维数组的遍历
1)双层for循环
2)for-range 循环
package main
import (
"fmt"
)
func main(){
var t = [...][3]int {{1,2,3},{4,5,6}}
fmt.Println("使用for 遍历")
for i:=0;i<len(t);i++{
for x:=0;x<len(t[i]);x++{
fmt.Printf("%v ",t[i][x])
}
fmt.Printf("\n t[%v]=%v\n",i,t[i])
}
fmt.Println("使用for-range循环")
for i,v := range t{
for s,x := range v{
fmt.Printf("t的%v的数组下标%v的值是%v\n",i,s,x)
}
fmt.Printf("t[%v]=%v\n",i,v)
}
}
// 执行结果
// PS D:\golang\goproject\src\src01\go_code\src> go run chapter07\demo06\main.go
// 使用for 遍历
// 1 2 3
// t[0]=[1 2 3]
// 4 5 6
// t[1]=[4 5 6]
// 使用for-range循环
// t的0的数组下标0的值是1
// t的0的数组下标1的值是2
// t的0的数组下标2的值是3
// t[0]=[1 2 3]
// t的1的数组下标0的值是4
// t的1的数组下标1的值是5
// t的1的数组下标2的值是6
// t[1]=[4 5 6]
示例
package main
import (
"fmt"
)
func main(){
// var t = [3][5]int {{67,98,75,86,96},{95,66,97,78,64},{65,78,83,78,96}}
var t [3][5]float64
//var f float64
var s float64
var z float64
for i,v := range t{
for s,_ := range v{
fmt.Printf("请输入%v班的第%v个学生成绩\n",i+1,s+1)
fmt.Scanln(&t[i][s])
}
//fmt.Println(t[i])
}
for i,v := range t{
//var w int
var a float64
for _,x := range v{
a += x
z++
}
fmt.Printf("%v班的平均分%v\n",i+1,a/float64(len(v)))
s +=a
}
fmt.Printf("所有班级人的平均分是%v",s/z)
}
// 执行结果
// PS D:\golang\goproject\src\src01\go_code\src> go run chapter07\demo06\main.go
// 请输入1班的第1个学生成绩
// 98
// 请输入1班的第2个学生成绩
// 78.5
// 请输入1班的第3个学生成绩
// 45.5
// 请输入1班的第4个学生成绩
// 98
// 请输入1班的第5个学生成绩
// 88
// 请输入2班的第1个学生成绩
// 87
// 请输入2班的第2个学生成绩
// 98
// 请输入2班的第3个学生成绩
// 56
// 请输入2班的第4个学生成绩
// 98
// 请输入2班的第5个学生成绩
// 45
// 请输入3班的第1个学生成绩
// 98
// 请输入3班的第2个学生成绩
// 98.5
// 请输入3班的第3个学生成绩
// 56
// 请输入3班的第4个学生成绩
// 98
// 请输入3班的第5个学生成绩
// 54
// 1班的平均分81.6
// 2班的平均分76.8
// 3班的平均分80.9
// 所有班级人的平均分是79.76666666666667
1.随机生成10个整数1-100的范围保存到数组里,并倒序打印,以及求平均值最大值和最大值下标,并查找是否有55
package main
import (
_ "container/list"
"fmt"
"math/rand"
)
func BinaryFind(arr *[10]int,leftIndex int,rightIndex int, find int) {
if leftIndex > rightIndex {
fmt.Println("不存在")
return
}
middle:=(leftIndex+rightIndex)/2
if (*arr)[middle] <find{
//说明 find的取值范围在左边。left---middel-1
BinaryFind(arr,leftIndex,middle-1,find)
}else if (*arr)[middle]>find{
//说明 find的取值范围在左边
BinaryFind(arr,middle+1,rightIndex,find)
} else {
fmt.Printf("找到了下标为%v",middle)
}
}
func main(){
var t [10]int
for i,_ := range t{
t[i]=rand.Intn(100)+1
}
for i:=0;i<len(t)-1;i++{
for x:=0; x <len(t)-1-i;x++{
if t[x] <t[x+1]{
t[x],t[x+1]=t[x+1],t[x]
}
}
}
fmt.Println(t)
var a int
for _,v := range t{
a+=v
}
fmt.Println("平均值",a/len(t))
fmt.Println("最大值",t[0])
fmt.Println("最大值的下标",0)
BinaryFind(&t,0,len(t),55)
}
// 执行结果
// [86 64 59 56 54 47 46 24 12 10]
// 平均值 45
// 最大值 86
// 最大值的下标 0
// 不存在
草都可以从石头缝隙中长出来更可况你呢

浙公网安备 33010602011771号