二分法查找概述
二分法查找也稱爲折半查找,屬於有序查找算法。用給定值key先和中間結點的關鍵字比較,中間結點把線形表分成兩個字表,若相等則查找成功;若不相等,再根據key與該中間結點關鍵字的比較結果確定下一步查找哪個字表,這樣遞歸進行,直到查找到或查找結束髮現表中沒有這樣的結點。
前提條件
列表中元素必須是有序的,如果是無須的則需要進行排序操作。
二分查找示例
假如有一組數爲1,3,5,7,9,11,13,15要查找給定值5。設三個變量front、mid、end分別指向數據的上界、中界和下界,mid=(front+end)/2
1、開始領front=0(指向1),end=7(指向15),則mid=3(指向7)。因爲mid>key,故應在前半段中查找。
2、新的end=mid-1=2,而front=0不變,則新的mid=1(指向3)。此時key>mid。故確定應在後半段中查找。
3、新fron=mid+1=2,而end=2不變,則新的mid=2,這是key=mid,查找成功。
二分法查找算法分析
時間複雜度:
1、最壞取款查找最後一個元素:T(n) = O(logn)
2、最好的情況,就是要查找的元素在中間。O(1)1,
二分法查找算法實現
1、golang實現
package main
import (
"fmt"
)
func BinarySearch(values []int, key int) int {
if len(values) == 0 {
return -1
}
front := 0
end := len(values) - 1
mid := (front + end) / 2
for front < end && values[mid] != key {
if values[mid] > key {
end = mid - 1
} else {
front = mid + 1
}
mid = (front + end) / 2
}
if values[mid] == key {
return mid
}
return -1
}
func main() {
values := []int{1, 3, 5, 7, 9, 11, 13, 15}
fmt.Println(values)
index := BinarySearch(values, 5)
fmt.Println(index)
index = BinarySearch(values, 100)
fmt.Println(index)
return
}
結果:
[1 3 5 7 9 11 13 15]
2
-1