二分(折半)查找算法
算法要求:要求序列是有序的(升序或者降序),并且查找目标值只有一个x
核心思想:将n个元素分成大致相等的两部分,取中间的值num[n/2]与x比较,若x=num[x/2],则找到,算法终止;若x<num[x/2],则在num[x/2]的左半边部分继续搜寻x,寻找中间值进行比较,以此类推,直到找到x;若x>num[x/2],则在num[x/2]的右半部分继续搜寻,同上。
二分查找性质:底层依赖数组,要求数据是有序的,更适合处理静态数据
递归查找
package main
import "fmt"
func BinaryFind(arr *[]int,leftIndex int,rightIndex int,findVal int){
//首先判断leftIndex是否大于rightIndex
if leftIndex>rightIndex{
fmt.Println("查找失败,初始索引值有问题!")
return
}
//寻找中间下标
middle := (leftIndex+rightIndex)/2
if (*arr)[middle]>findVal{
BinaryFind(arr,leftIndex,middle-1,findVal)
}else if (*arr)[middle]<findVal{
BinaryFind(arr,middle+1,rightIndex,findVal)
}else{
fmt.Println("查找成功,下标为:",middle)
}
}
func main(){
Myarr := []int{1,4,6,8,12}
BinaryFind(&Myarr,0,len(Myarr)-1,8)
}
非递归
//java
public int search(int[] nums, int target) {
int low = 0;
int high = nums.length - 1;
int mid = (low + high)/2;
while(low <= high){
if(nums[mid] > target){
high = mid - 1;
}else if(nums[mid] < target){
low = mid + 1;
}else{
return mid;
}
mid = (high + low)/2;
}
return -1;
}
//Golang
func search(nums []int, target int) int {
low := 0
high := len(nums)-1
mid := (low+high)/2
for low <= high{
if nums[mid] < target{
low = mid +1
}else if nums[mid] >target{
high = mid-1
}else{
return mid
}
mid = (low+high)/2
}
return -1
}