二分查找go实现

二分查找

二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。
O(log2n)

go实现

这里是升序情况
递归实现
1. 与中间数比较
2. 小于则递归中间数左半数组
3. 大于于则递归中间数右半数组 加上 length/2 + 1
4. 返回下标,-1表示没找到

//递归法
func binarySearch(arr []int, need int) int {
	length := len(arr)

	if length == 0 {
		return -1
	}
	//fmt.Println("当前执行到了:", arr)
	if need == arr[length/2] {
		return length / 2
	} else if need < arr[length/2] {
		return binarySearch(arr[:length/2], need)
	} else {
		return binarySearch(arr[length/2+1:], need) + length/2 + 1
	}
}

循环实现
1. 始化左游标和右游标
2. 相等则返回下标
3. 大于则左游标在目前中间位置(i)右移一个
4. 小于则右游标在目前中间位置(i)左移一个
5. 循环2-4步。左游标大于右游标则结束

//循环法
//二分查找,升序数组
func BinarySearch3(arr []int, target int) int {
	//变量l,r的意义是:从[l......r]区间内查找target的数的下标
	l, r := 0, len(arr)-1
	//l == r时,说明数组只有1个数,若l>r时,则数组没有元素条件结束
	for l <= r {
		mid := (l + r) / 2
		//正好是中位数
		if target == arr[mid] {
			return mid
		}
		//在右区间查找
		if target > arr[mid] {
			l = mid + 1
		} else { //在左区间查找
			r = mid - 1
		}		
	}
	return -1
}

你可能感兴趣的:(数据结构)