算法—二分查找

116 阅读1分钟

二分法是一种非常高效的排序算法,

基本用法

func binarySearch(data []int, target  int) int {
	left,right := 0 ,len(data)
        
        // 循环条件<= 避免造成死循环
	for left <= right {
                // 取中的几种方式
                // 1、(left+right)/2 // 可能存在溢出情况
                // 2、left + (right-left)/2
                // 3、left + ((right-left)>>1) // 使用位运算效率更高
                
		mid := left + (right-left)/2

		if data[mid] == target{
			return mid
		} else if data[mid] < target{
			left = mid+1
		}else{
			right = mid-1
		}
	}

	return -1;
}

二分查找的下界


// 二分法下界(重复元素 第一个元素)
func binarySearchV1(data []int, target  int) int {
	left,right := 0 ,len(data)

	for left <= right {
		mid := left + (right-left)/2

		if data[mid]>target {
			right = mid-1
		}else if data[mid]<target {
			left = mid+1
		}else{
			if mid ==0 || data[mid-1]!=target{
				return mid
			}else{
				right = mid-1
			}
		}
	}

	return -1
}

二分查找的上界


// 二分法上界(重复元素 最后一个元素)
func binarySearchV2(data []int, target  int) int {
	left,right := 0 ,len(data)

	length := right

	for left <= right {
		mid := left + (right-left)/2

		if data[mid]>target {
			right = mid-1
		}else if data[mid]<target {
			left = mid+1
		}else{
			if mid ==length-1 || data[mid+1]!=target{
				return mid
			}else{
				left = mid+1
			}
		}
	}

	return -1
}

参考

二分查找详解及其变种实现&LeetCode题解 - 力扣(LeetCode) (leetcode-cn.com)