Go语言精修(尚硅谷笔记)第八章

八、排序和查找

8.1 排序

排序的分类:

(1)内部排序:

指将需要处理的所有数据都加载到内部存储器中进行排序。包括(交换式排序法选择式排序法插入式排序法

(2)外部排序法:

数据量过大,无法全部加载到内存中,需要借助外部存储进行排序。包括(合并排序法直接合并排序法

  • 冒泡排序思路

    image-20210114185835373

  • 冒泡排序实现

    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 } ,输入一个数看看该数组是否存在此数,并且求出下标,如果没有就提示"没有这个数"。【会使用到递归】

  • 二分查找思路

image-20210114190303629

  • 实现

    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 , 再赋值。
  • 使用演示
  • 二维数组在内存的存在形式(重点)

image-20210114190703459

  • 初始化

    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()	
	}
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值