golang语言的二分法查找和插入代码

二分法查找,在有序数组中,查找应该使用此方法,注意for循环的退出条件。

func binary_search(arr []int,target int) int {
	n := len(arr)
	if n< 1{
		return -1;
	}
	l,h :=0,n-1
	// 要等号,不要会有边界问题
    for l <= h {
		mid := (l+h) /2 
		if  arr[mid] ==  target{
			return  mid
		}else if arr[mid] < target{
			l = mid+1
		}else{
			h = mid-1
		}
	}
	return -1
}

二分法插入,要保证插入时的稳定性,即元素相等时,后插入元素在后面。注意其对二分查找的改进,以及在切片指针插入元素时,使用append引发的错误。

// 用到append函数,指针
func bianry_insert(arr *[]int,target int) {
    if len(*arr) < 1 {
		*arr = append(*arr,target)
		return
	}
	l,mid,h:=0,0,len(*arr)-1

	for l<=h{
		mid =(l+h) /2
		if (*arr)[mid] == target{
			// 微调,保证插入时稳定性
			// h =mid
			// l =mid+1
			h = mid + 1
			l = mid + 1
		}else if (*arr)[mid] < target{
			l =mid+1
		}else{
			h = mid-1
		}
	}
	// 插入到mid位置,mid位置必定是合法的
	// 但是mid找到和未找到时,是mid-1还是mid位置有问题
	// 以mid为准有问题,可以考虑h
	//  分析边界条件,在相等时简单,不相等时,退出循环时,l=h+1
	// if arr[mid] < target , l -1 = h =mid ;else l =mid = h +1
	//  arr[l],arr[h],关系, arr[h] <= t < arr[l],稳定插入时,应该是h+1位置
	fmt.Printf("h:%d \n",h)
	// temp := append((*arr)[0:h+1],target)
	//  这是golang使用指针时,值覆盖了
	// *arr = append(temp,(*arr)[h+1:]...)
	*arr = append(*arr,0)
    for i:=len(*arr)-1;i>h+1;i--{
		(*arr)[i] = (*arr)[i-1]
	}
	(*arr)[h+1] = target;
}

     二分法插入是插入排序的核心操作

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值