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类型

猜你喜欢

转载自blog.csdn.net/qq_38697437/article/details/106347967