Search CTRL + K

Binary Search

二分查找(binary search) 是基于分治策略的搜索算法,它利用数据有序性,每次搜索减少一半搜索范围。

普遍算法

只采取左闭右开方式。

func BinarySearch(arr []int, target int) (int, int) {
	lo, hi := 0, len(arr)
	for lo < hi {
		mid := lo + ((hi - lo) >> 2)
		if arr[mid] > target {
			hi = mid
		} else if arr[mid] < target {
			lo = mid + 1
		} else {
			return mid, -1
		}
	}
	return -1, lo
}

变体

元素可重复数组中找到第一个出现的

最后返回 leftright 都无所谓,因为退出循环一定意味着两者相等。

func BinarySearchFirst(arr []int, target int) (int, int) {
	lo, hi := 0, len(arr)
	for lo < hi {
		mid := lo + ((hi - lo) >> 2)
		if arr[mid] >= target {
			hi = mid
		} else {
			lo = mid + 1
		}
	}
	if lo < len(arr) && arr[lo] == target {
		return lo, -1
	}
	return -1, lo
}

元素可重复数组中找到最后一个出现的

最后返回 leftright 都无所谓,因为退出循环一定意味着两者相等。

func BinarySearchLast(arr []int, target int) (int, int) {
	lo, hi := 0, len(arr)
	for lo < hi {
		mid := lo + ((hi - lo) >> 2)
		if arr[mid] > target {
			hi = mid
		} else {
			lo = mid + 1
		}
	}
	if lo > 0 && arr[lo-1] == target {
		return lo - 1, -1
	}
	return -1, lo
}

局限