目录


步骤

middle = (leftIndex + RightIndex) /2FindValarr[middle] > FindValLeftIndex~(midlle - 1)arr[middle] < FindValmiddle + 1 ~RightIndexarr[middle] == FindValLeftIndex > 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