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\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增加元素,會自動擴容
  • mapvalue也經常使用struct類型
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章