Golang——排序和查找

冒泡排序

在这里插入图片描述

//冒泡排序(asc)
package main
import(
	"fmt"
)
func main() {
	a:=[]int{24,69,80,57,13,24} //注意重复情况
	lenth:=len(a)
	for i:=0;i<lenth-1;i++{ //最多lenth-1趟
		for j:=0;j<lenth-1-i;j++{
			if a[j]>a[j+1] {
				temp:=a[j]
				a[j]=a[j+1]
				a[j+1]=temp
			}
		}
	}
	fmt.Println(a)

}

顺序查找

较为简单,遍历查询即可,故仅贴出代码

func sequentialSearch1(){//顺序查找:第一种方式
	names:=[4]string("白眉鹰王","金毛狮王","紫衫龙王","青翼蝠王")
	var heroName =" "
	fmt.Println("请输入要查找的人名。。")
	fmt.Scanln(&heroName)
	for i:=0;i<len(names);i++{
		if heroName ==names[i]{
			fmt.Printf("找到%v,下标%v\n",heroName,i)
			break
		}else if i ==(len(names)-1){
			fmt.Printf("没有找到%w\n",heroName)
		}
	}
}
func sequentialSearch2(){//顺序查找:第二种方式
	index :=-1
	for i:=0;i<len(names);i++{
		if heroName =names[i]{
			index=i //将找到的值对应的下标赋给index
			break
		}
	}
	if index I=-1{
		fmt.Printf("找到%v,下标%v\n",heroName,index)
	}else{
	fmt.Println("没有找到",heroName)
	}
}
func main() {
	var choice int
	fmt.Scanln("1.顺序查找方法1,2.方法2",&choice)
	switch choice{
		choice==1:sequentialSearch1()
		choice==2:sequentialSearch2()
	}
}

二分查找

在这里插入图片描述

使用for循环 重复查找过程:
(LeetCode 704.二分查找)

//二分查找
func search(nums []int, target int) int {
    left,right:=0,len(nums)-1
    for left<=right{
        middle :=(left+right)/2
        if nums[middle]>target{
            right=middle-1
        }else if nums[middle]==target{
            return middle
        }else{
            left=middle+1
        }
    }
    return -1
}

以函数的形式使用二分查找,用到了递归的思想:

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 {
		BinaryFind(arr, leftIndex, middle - 1, findVal)
	} else if (*arr)[middle] < findVal {
		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)//test
}

再来一道LeetCode 374.猜数字大小

func guessNumber(n int) int {
    low,high:=0,n
    for low<=high{
        mid:=(low+high)/2
        switch guess(mid){
            case 0:return mid
            case -1:high=mid-1
            case 1:low=mid+1
        }
    }
    return 0
}

官方的题解。。直接调用二分函数:

func guessNumber(n int) int {
    return sort.Search(n, func(x int) bool { return guess(x) <= 0 })
}

sort包中的Search函数:

func Search(n int, f func(int) bool) int

Search函数采用二分法搜索找到[0, n)区间内最小的满足f(i)==true的值i。也就是说,Search函数希望f在输入位于区间[0, n)的前面某部分(可以为空)时返回假,而在输入位于剩余至结尾的部分(可以为空)时返回真;Search函数会返回满足f(i)==true的最小值i。如果没有该值,函数会返回n。注意,未找到时的返回值不是-1,这一点和strings.Index等函数不同。Search函数只会用区间[0, n)内的值调用f。

一般使用Search找到值x在插入一个有序的、可索引的数据结构时,应插入的位置。这种情况下,参数f(通常是闭包)会捕捉应搜索的值和被查询的数据集。

例如,给定一个递增顺序的切片,调用Search(len(data), func(i int) bool { return data[i] >= 23 })会返回data中最小的索引i满足data[i] >= 23。如果调用者想要知道23是否在切片里,它必须另外检查data[i] == 23。

搜索递减顺序的数据时,应使用<=运算符代替>=运算符。

下列代码尝试在一个递增顺序的整数切片中找到值x:

x := 23
i := sort.Search(len(data), func(i int) bool { return data[i] >= x })
if i < len(data) && data[i] == x {
	// x is present at data[i]
} else {
	// x is not present in data,
	// but i is the index where it would be inserted.
}

一个更古怪的例子,下面的程序会猜测你持有的数字:

func GuessingGame() {
	var s string
	fmt.Printf("Pick an integer from 0 to 100.\n")
	answer := sort.Search(100, func(i int) bool {
		fmt.Printf("Is your number <= %d? ", i)
		fmt.Scanf("%s", &s)
		return s != "" && s[0] == 'y'
	})
	fmt.Printf("Your number is %d.\n", answer)
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值