golang学习笔记第二部分:10.排序查找和二维数组

golang学习笔记第二部分:10.排序查找和二维数组

20、排序和查找

排序是将一组数据按指定的顺序进行排列的过程,排序分为:内部排序、外部排序,内部排序是将所有数据都加载都内存中,外部排序是借助外部存储进行排序。

  • 交换式排序法:
  • 冒泡排序法:从前向后,依次比较相邻的2个数字,大/小的数据放到后面;有n个元素,需要进行n-1轮对比,每一轮确定一个数的位置,每一轮的比较次数在逐渐减少 代码: 1)先完成将最大的数字放最后; 2)再将第二大的放到倒数第二;
    3)总结规律,合并循环
  • 顺序查找:按顺序遍历整个数组查找 二分查找:数组是有序的,先找到中间的下标(start+end)/2,对应的值和X比较,如果大于,则X在左边区间,反之在右边区间,循环直到相等,或没有相等的;查找过程递归执行,递归退出条件是:查找区间<0
package main

import "fmt"

//顺序查找,有一个数列,从控制台接收一个值,依次比较,返回结果
var arr [4]string = [4]string{"king", "kong", "sing", "qing"}
var msg = ""

func find1() {
	//第一种方法
	for i := 0; i < len(arr); i++ {
		if msg == arr[i] {
			fmt.Printf("you find %v, index is %v", msg, i)
			break
		} else if i == (len(arr) - 1) {
			fmt.Println("you faile,you out.")
		}
	}
}

func find2() {
	//第二种方法,推荐使用,操作状态,循环中尽量减少内容处理
	index := -1 //定义标识状态的变量
	for i := 0; i < len(arr); i++ {
		if msg == arr[i] {
			index = i //找到了改变状态
			break
		} else if i == (len(arr) - 1) {
			fmt.Println("you faile,you out.")
		}
	}
	if index != -1 { //最后对状态进行判断
		fmt.Printf("you find %v, index is %v", msg, index)
	}
}

func main() {
	fmt.Println("please input message:")
	fmt.Scanln(&msg)
	find2()
}

package main

import "fmt"

//二分查找法示例

func BinaryFind(arr *[6]int, leftIndex int, rightIndex int, findVal int) {
	//判断左右下标,递归退出规则
	if leftIndex > rightIndex {
		fmt.Println("找不到")
		return
	}
	middle := (leftIndex + rightIndex) / 2
	if (*arr)[middle] > findVal { //落在左边区间
		BinaryFind(arr, leftIndex, middle-1, findVal)
	} else if (*arr)[middle] < findVal { //落在右边区间
		BinaryFind(arr, middle+1, rightIndex, findVal)
	} else { //相等
		fmt.Printf("找到了,下标为%v", middle)
	}
}

func main() {
	var arr [6]int = [6]int{1, 20, 45, 66, 245, 1234} //数组必须是已排好序的

	BinaryFind(&arr, 0, len(arr)-1, 3)
}

package main

import "fmt"

//冒泡排序法
func BubbleSort(arr *[5]int) {
	fmt.Println("排序前的数组:", (*arr))
	tmp := 0
	//外层循环
	for j := 0; j < len(*arr)-1; j++ {
		//内层比较大小
		for i := 0; i < len(*arr)-1-j; i++ {
			if (*arr)[i] > (*arr)[i+1] { //从小到大 > ; 从大到小 <
				tmp = (*arr)[i]
				(*arr)[i] = (*arr)[i+1]
				(*arr)[i+1] = tmp
			}
		}
		fmt.Printf("第%v轮排序的数组 %v: \n", j+1, (*arr))
	}
}

func main() {
	arr := [5]int{13, 21, 65, 32, 7}

	BubbleSort(&arr)
}

21、二维数组的介绍

数组里的元素也是数组。二维数组保存的是一维数组的首地址。 声明:var 数组名 [大小][大小]类型 = [大小][大小]类型{{初值},{初值}} 其他用法和一维数组类似。

package main

import "fmt"

func main() {
	//定义一个二维数组
	var arr [4][6]int
	arr[1][2] = 1
	arr[2][1] = 2
	arr[2][3] = 3
	fmt.Println(arr)

	//遍历二维数组方法1
	for i := 0; i < 4; i++ {
		for j := 0; j < 6; j++ {
			fmt.Print(arr[i][j], " ") //逐个元素取出
		}
		fmt.Println() //换行
	}

	fmt.Println("===============")

	//遍历二维数组方法2
	for _, v := range arr {
		for _, vv := range v {
			fmt.Print(vv, " ")
		}
		fmt.Println()
	}

	fmt.Printf("%p %p \n", &arr[0], &arr[1])       //每个元素是个6 int,6*8=48,转为16进制是30
	fmt.Printf("%p %p \n", &arr[0][0], &arr[1][0]) //二维数组保存的是一维数组的首地址

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值