二分法查找,在有序数组中,查找应该使用此方法,注意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;
}
二分法插入是插入排序的核心操作