八、排序和查找
8.1 排序
排序的分类:
(1)内部排序:
指将需要处理的所有数据都加载到内部存储器中进行排序。包括(交换式排序法、选择式排序法和插入式排序法)
(2)外部排序法:
数据量过大,无法全部加载到内存中,需要借助外部存储进行排序。包括(合并排序法和直接合并排序法)
-
冒泡排序思路
-
冒泡排序实现
package main import ( "fmt" ) //冒泡排序 func BubbleSort(arr *[5]int) { fmt.Println("排序前arr=", (*arr)) temp := 0 //临时变量(用于做交换) //冒泡排序..一步一步推导出来的 for i :=0; i < len(*arr) - 1; i++ { for j := 0; j < len(*arr) - 1 - i; j++ { if (*arr)[j] > (*arr)[j + 1] { //交换 temp = (*arr)[j] (*arr)[j] = (*arr)[j + 1] (*arr)[j + 1] = temp } } } fmt.Println("排序后arr=", (*arr)) } func main() { //定义数组 arr := [5]int{24,69,80,57,13} //将数组传递给一个函数,完成排序 BubbleSort(&arr) fmt.Println("main arr=", arr) //有序? 是有序的 }
8.2 查找
1 ) 顺序查找
2 ) 二分查找(该数组是有序)
请对一个有序数组进行二分查找 { 1 , 8., 10 , 89 , 1000 , 1234 } ,输入一个数看看该数组是否存在此数,并且求出下标,如果没有就提示"没有这个数"。【会使用到递归】
- 二分查找思路
-
实现
package main import ( "fmt" ) //二分查找的函数 /* 二分查找的思路: 比如我们要查找的数是 findVal 1. arr是一个有序数组,并且是从小到大排序 2. 先找到 中间的下标 middle = (leftIndex + rightIndex) / 2, 然后让 中间下标的值和findVal进行比较 2.1 如果 arr[middle] > findVal , 就应该向 leftIndex ---- (middle - 1) 2.2 如果 arr[middle] < findVal , 就应该向 middel+1---- rightIndex 2.3 如果 arr[middle] == findVal , 就找到 2.4 上面的2.1 2.2 2.3 的逻辑会递归执行 3. 想一下,怎么样的情况下,就说明找不到[分析出退出递归的条件!!] if leftIndex > rightIndex { // 找不到.. return .. } */ func BinaryFind(arr *[6]int, leftIndex int, rightIndex int, findVal int) { //判断leftIndex 是否大于 rightIndex if leftIndex > rightIndex { fmt.Println("找不到") return } //先找到 中间的下标 middle := (leftIndex + rightIndex) / 2 if (*arr)[middle] > findVal { //说明我们要查找的数,应该在 leftIndex --- middel-1 BinaryFind(arr, leftIndex, middle - 1, findVal) } else if (*arr)[middle] < findVal { //说明我们要查找的数,应该在 middel+1 --- rightIndex BinaryFind(arr, middle + 1, rightIndex, findVal) } else { //找到了 fmt.Printf("找到了,下标为%v \n", middle) } } func main() { arr := [6]int{1,8, 10, 89, 1000, 1234} //测试一把 BinaryFind(&arr, 0, len(arr) - 1, -6) }
8.3 多维数组
- 语法:var 数组名 大小类型
- 比如:var arr[ 2 ][ 3 ]int , 再赋值。
- 使用演示
- 二维数组在内存的存在形式(重点)
-
初始化
var 数组名 [大小][大小]类型 =[大小][大小]类型{{初值},{初值}}
-
使用演示
package main import ( "fmt" ) func main() { arr3 := [2][3]int{{1,2,3}, {4,5,6}} fmt.Println("arr3=", arr3) }
-
说明:二维数组在声明/定义时也对应有四种写法 和一维数组类似
var 数组名 [大小][大小]类型 =[大小][大小]类型 { { 初值 },{ 初值 } } var 数组名 [大小][大小]类型 =[...][大小]类型{{初值},{初值}} var 数组名 = [大小][大小]类型{{初值},{初值}} var 数组名 = [...][大小]类型{{初值},{初值}}
8.4 二维数组遍历
- 双层for循环完成遍历
- for-range方式完成遍历
package main
import (
"fmt"
)
func main() {
//演示二维数组的遍历
var arr3 = [2][3]int{{1,2,3}, {4,5,6}}
//for循环来遍历
for i := 0; i < len(arr3); i++ {
for j := 0; j < len(arr3[i]); j++ {
fmt.Printf("%v\t", arr3[i][j])
}
fmt.Println()
}
//for-range来遍历二维数组
for i, v := range arr3 {
for j, v2 := range v {
fmt.Printf("arr3[%v][%v]=%v \t",i, j, v2)
}
fmt.Println()
}
}