#顺序查找
func asd(a []int, b int) int {
for i := 0; i < len(a); i++ {
if a[i] == b {
return i
}
}
return -1
}
#二分查找
##循环实现
func BinaryFind(arr []int, leftIndex int, rightIndex int, findVal int) {
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.Printf("找到了,下标为:%v \n", middle)
}
}
##递归实现
func BinarySearchRecursive(a []int, v int) int {
n := len(a)
if n == 0 {
return -1
}
return bs(a, v, 0, n-1)
}
func bs(a []int, v int, low, high int) int {
if low > high {
return -1
}
mid := (low + high) >> 1
if a[mid] == v {
return mid
} else if a[mid] > v {
return bs(a, v, low, mid-1)
} else {
return bs(a, v, mid+1, high)
}
}
#插值查找
func BinaryFind(arr []int, leftIndex int, rightIndex int, findVal int) {
if leftIndex > rightIndex {
fmt.Println("找不到")
return
}
middle := leftIndex + (rightIndex-leftIndex)*(findVal-arr[leftIndex])/(arr[rightIndex]-arr[leftIndex])
if arr[middle] > findVal {
BinaryFind(arr, leftIndex, middle-1, findVal)
} else if arr[middle] < findVal {
BinaryFind(arr, middle+1, rightIndex, findVal)
} else {
fmt.Printf("找到了,下标为:%v \n", middle)
}
}
#斐波那契查找
func FibonacciSearch(arr []int, v int) int {
fibs := getFibonacciArray(10)
fmt.Println("fibonacciArray:", fibs)
// 根据斐波那契数列找适合的区间
k := 0
l := len(arr)
for l > fibs[k] {
k++
}
// 2、构建新序列,多出位补slice[n-1]
tmpArr := make([]int, fibs[k]-1)
copy(tmpArr, arr)
for i := l; i < len(tmpArr); i++ {
tmpArr[i] = arr[l-1]
}
// 开始斐波那契查找
left, right := 0, l-1
for left <= right {
// 找黄金分割点
mid := left + fibs[k-1] - 1
// fmt.Println("mid:", mid)
// fmt.Println("tmpArr:", tmpArr)
if tmpArr[mid] == v {
if mid < l {
return mid
} else {
// 位于tempS的填补位
return l - 1
}
} else if tmpArr[mid] > v {
// 左边
right = mid - 1
// 查找值在前面的fibs(k-1)区间中
k -= 1
} else {
// 右边
left = mid + 1
// 查找值在后面的fibs(k-2)区间中
k -= 2
}
}
return -1
}
// 获取斐波那契数列
func getFibonacciArray(n int) []int {
fArr := make([]int, n+1, n+1) // 数列第一位从下标1开始
fArr[1] = 1
fArr[2] = 1
for i := 3; i <= n; i++ {
fArr[i] = fArr[i-1] + fArr[i-2]
}
return fArr[1:]
}