一、冒泡排序
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\n", &arr[0]) //0xc0420540a0
fmt.Printf("%p\n", &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\t", arr[ i][j])
fmt.Println()
}
}
//for-range來遍歷二維數組
for i, v := range arr {
for j, v2 := range v {
fmt.Printf("arr[%v][%v] = %v \t", 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\t", 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
類型