二分查詢法(Go語言)
阿新 • • 發佈:2021-02-02
技術標籤:資料結構與演算法
二分查詢法,在一個有序的數列裡,把中間元素v與查詢元素target相比較:
- 若相等則返回
- 若大於target則在v的右端繼續使用二分查詢法
- 若小於target則在v的左端繼續使用二分查詢法
二分查詢法-迭代法(Go語言)
package main
import "fmt"
//二分查詢(前提必須在有序的數組裡,查詢target)
//如果找到target,返回相應的索引index
//如果沒有找到target,返回-1
//時間複雜度O(logN)
func binarySearch(arr *[]int, target int, l int, r int ) int {
//在arr[l...r]中查詢target
for l <= r {
//middleIndex := r+l/2 //注意:這裡容易產生bug(r+l溢位int最大值),改寫成如下方式
middleIndex := l + (r-l)/2
if (*arr)[middleIndex] == target {
return middleIndex
}else if (*arr)[middleIndex] > target {
//在arr[l...middleIndex - 1]中查詢target
r = middleIndex - 1
}else {
//在arr[middleIndex + 1...r]中查詢target
l = middleIndex + 1
}
}
return -1
}
func main() {
arr := []int{1,2,5,8,11,13}
index := binarySearch(&arr, 11,0, len(arr)-1)
fmt.Println(index)
}
輸出:
4
二分查詢法-遞迴法(Go語言):
package main
import "fmt"
//二分查詢(前提必須在有序的數組裡,查詢target)
//如果找到target,返回相應的索引index
//如果沒有找到target,返回-1
//時間複雜度O(logN)
func binarySearch(arr *[]int, target int, l int, r int) int {
//在arr[l...r]中查詢target
for l <= r {
//middleIndex := r+l/2 //注意:這裡容易產生bug(r+l溢位int最大值),改寫成如下方式
middleIndex := l + (r-l)/2
if (*arr)[middleIndex] == target {
return middleIndex
}else if (*arr)[middleIndex] > target {
//在arr[l...middleIndex - 1]中查詢target
return binarySearch(arr, target, l, middleIndex - 1)
}else {
//在arr[middleIndex + 1...r]中查詢target
return binarySearch(arr, target, middleIndex + 1, r)
}
}
return -1
}
func main() {
arr := []int{1,2,5,8,11,13}
index := binarySearch(&arr, 11,0, len(arr)-1)
fmt.Println(index)
}
輸出:
4
時間複雜度O(logN)
,遞迴法的效能比迭代法的略差。