Go:排序查找、二维数组、Map
作者:互联网
文章目录
一、冒泡排序
func main() {
arr := [...]int{2, 3, 1, 5, 6, 0}
bubbleSort(&arr)
fmt.Println(arr)//[0 1 2 3 5 6]
}
func bubbleSort(arr *[6]int) {
for i := 0; i < len(*arr); i++ {
for j := 0; j < len(*arr)-i-1; j++ {
if (*arr)[j] > (*arr)[j+1] {
tmp := (*arr)[j]
(*arr)[j] = (*arr)[j+1]
(*arr)[j+1] = tmp
}
}
}
}
二、顺序查找
func main() {
names := [...]string{"张", "三", "李", "四"}
ifFind := orderFind(names, "张")
if ifFind == -1 {
fmt.Println("未找到")
} else {
fmt.Println("找到")
}
}
func orderFind(arr [4]string, name string) int {
index := -1
for i := 0; i < len(arr); i++ {
if arr[i] == name {
index = i
break
}
}
return index
}
三、二分查找
func main() {
ints := [...]int{1, 2, 3, 4, 5, 6}
binary(ints, 0, 5, 7)
}
func binary(arr [6]int, first int, last int, want int) {
if first >= last-1 {
fmt.Println("未找到")
return
}
middle := (first + last) / 2
if arr[middle] == want {
fmt.Println("找到了")
} else if arr[middle] > want {
binary(arr, first, middle, want)
} else {
binary(arr, middle, last, want)
}
}
四、二维数组
二维数组其实就是一个数组的元素依就是数组的数组,二维元素的地址和一维元素的地址是一样的。
func main() {
var arr [2][2]int
arr[0][0] = 1
arr[1][1] = 2
fmt.Println(arr) //[[1 0] [0 2]]
fmt.Println(arr[0]) //[1 0]
fmt.Println(arr[1]) //[0 2]
fmt.Printf("%p
", &arr[0]) //0xc0420540a0
fmt.Printf("%p
", &arr[0][0]) //0xc0420540a0
}
二维数组的定义:
①先声明定义,再赋值
语法: var 数组名 [大小][大小]类型
如: var arr [2][3]int
②声明定义并赋值
var 数组名 [大小][大小]类型 = [大小][大小]类型{{初值…},{初值…}}
如:var arr [2][2]int = [2][2]int{{1,2},{3,4}}
二维数组的遍历
func main() {
//演示二维数组的遍历
var arr = [2][3]int{{1, 2, 3}, {4, 5, 6}}
//for循环来遍历
for i := 0; i < len(arr); i++ {
for j := 0; j < len(arr[1]); j++ {
fmt.Printf("% v ", arr[ i][j])
fmt.Println()
}
}
//for-range来遍历二维数组
for i, v := range arr {
for j, v2 := range v {
fmt.Printf("arr[%v][%v] = %v ", i, j, v2)
}
fmt.Println()
}
}
五、Map
语法:var map 变量名 map[keytype]valuetype
例:var a map[string]string
注意:声明是不会分配内存的,初始化需要make
,分配内存后才能赋值和使用
5.1 Map的使用
①第一种
func main() {
var persons map[int]string
//make给map分配内存空间
persons = make(map[int]string, 10)
persons[1] = "张三"
persons[2] = "李四"
fmt.Println(persons)//map[1:张三 2:李四]
}
②第二种
func main() {
persons := make(map[int]string)
persons[1] = "张三"
persons[2] = "李四"
fmt.Println(persons)//map[1:张三 2:李四]
}
③第三种
func main() {
persons := map[int]string{
1: "张三",
2: "李四",
}
persons[3] = "王五"
fmt.Println(persons)//map[1:张三 2:李四 3:王五]
}
5.2 Map的增删改查操作
①map增加和更新
map["key"] = value
//如果key
没有就是增加,如果key
存在就是修改
func main() {
persons := make(map[int]string)
persons[1] = "张三"
persons[2] = "李四"
fmt.Println(persons) //map[1:张三 2:李四]
persons[2] = "王五"
fmt.Println(persons)//map[2:王五 1:张三]
}
②删
func main() {
persons := make(map[int]string)
persons[1] = "张三"
persons[2] = "李四"
fmt.Println(persons) //map[1:张三 2:李四]
delete(persons, 1)
fmt.Println(persons) //map[2:李四]
}
③查
func main() {
persons := make(map[int]string)
persons[1] = "张三"
persons[2] = "李四"
fmt.Println(persons) //map[1:张三 2:李四]
name := persons[2]
fmt.Println(name) //李四
}
5.3 Map的遍历
func main() {
persons := make(map[int]string)
persons[1] = "张三"
persons[2] = "李四"
for k, v := range persons {
fmt.Printf("%d->%v ", k, v)//1->张三 2->李四
}
}
5.4 Map切片
func main() {
//声明一个切片,类型为map
persons := make([]map[int]string, 2)
persons[0] = make(map[int]string, 2)
persons[0][0] = "张三"
persons[0][1] = "李四"
persons[1] = make(map[int]string, 2)
persons[1][0] = "张三2"
persons[1][1] = "李四2"
fmt.Println(persons)//[map[0:张三 1:李四] map[0:张三2 1:李四2]]
//使用append()函数动态扩展切片
newPerson := map[int]string{
3: "王五",
}
persons = append(persons, newPerson)
fmt.Println(persons)//[map[0:张三 1:李四] map[0:张三2 1:李四2] map[3:王五]]
}
5.5 map 使用细节
map
是引用类型,遵守引用类型传递的机制,在一个函数接收map
,修改后,会直接修改原来的map
map
的容量达到后,再想map
增加元素,会自动扩容map
的value
也经常使用struct
类型
标签:Println,Map,arr,map,int,fmt,persons,查找,Go 来源: https://blog.csdn.net/m0_67391270/article/details/123623396