Golang二分查找

目录

步骤

实例


步骤

  1. 先找到中间的下标middle = (leftIndex + RightIndex) /2 ,然后让中间的下标值和FindVal比较

    1. 如果arr[middle] > FindVal,那么就向LeftIndex~(midlle - 1)区间找

    2. 如果arr[middle] < FindVal,那么就向middle + 1 ~RightIndex区间找

    3. 如果arr[middle] == FindVal,那么直接返回

  2. 从1的a、b、c递归执行,知道找到位置

  3. 如果LeftIndex > RightIndex,则表示找不到,退出

实例

package main

import (
	"fmt"
	"sort"
)

// 二分查找循环实现
func BinarySearch(s []int, k int) int {
	// 低位高位 长度
	lo, hi := 0, len(s)-1
	// 如果低位小于等于高位一直循环
	for lo <= hi {
		// 取中间位,向右移动一位等于除以2
		m := (lo + hi) >> 1
		if s[m] < k {
			lo = m + 1
		} else if s[m] > k {
			hi = m - 1
		} else {
			return m
		}
	}
	return -1
}

// 二分查找递归调用
func BinarySearch2(arr *[]int, leftIndex int, rightIndex int, findVal int) {
	// 退出条件,判断条件不能为等号,因为在相等时仍然要进行一次判断。
	// 退出条件为等号可能会造成明明数组中有该值,却错过判断的情况发生。
	if leftIndex > rightIndex {
		fmt.Println("没找到")
		return
	}

	middleIndex := (leftIndex + rightIndex) / 2
	if findVal > (*arr)[middleIndex] {
		// 倘若不对middleIndex进行+1/-1的操作,函数有可能陷入死循环
		BinarySearch2(arr, middleIndex+1, rightIndex, findVal)
	} else if findVal < (*arr)[middleIndex] {
		BinarySearch2(arr, leftIndex, middleIndex-1, findVal)
	} else {
		fmt.Println("找到了!下标为:", middleIndex)
	}
}

func main() {
	// 二分查找必须有序
	arr := []int{4, 93, 84, 85, 80, 37, 81, 93, 27, 12}
	// 先排序
	sort.Ints(arr)
	fmt.Printf("arr: %v\n", arr)
	// 查找
	fmt.Println(BinarySearch(arr, 80))

	fmt.Println("---------------")

	BinarySearch2(&arr, 0, len(arr), 80)

}

输出:

arr: [4 12 27 37 80 81 84 85 93 93]
4
---------------
找到了!下标为: 4

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值