算法原理
二分查找算法的原理如下:
如果待查序列為空铡原,那么就返回-1,并退出算法商叹;這表示查找不到目標(biāo)元素燕刻。
如果待查序列不為空,則將它的中間元素與要查找的目標(biāo)元素進(jìn)行匹配剖笙,看它們是否相等卵洗。
如果相等,則返回該中間元素的索引弥咪,并退出算法过蹂;此時(shí)就查找成功了。
如果不相等聚至,就再比較這兩個(gè)元素的大小酷勺。
如果該中間元素大于目標(biāo)元素,那么就將當(dāng)前序列的前半部分作為新的待查序列晚岭;這是因?yàn)楹蟀氩糠值乃性囟即笥谀繕?biāo)元素鸥印,它們?nèi)急慌懦恕?/p>
如果該中間元素小于目標(biāo)元素勋功,那么就將當(dāng)前序列的后半部分作為新的待查序列坦报;這是因?yàn)榍鞍氩糠值乃性囟夹∮谀繕?biāo)元素,它們?nèi)急慌懦恕?/p>
在新的待查序列上重新開始第1步的工作狂鞋。
二分查找之所以快速片择,是因?yàn)樗谄ヅ洳怀晒Φ臅r(shí)候,每次都能排除剩余元素中一半的元素骚揍。因此可能包含目標(biāo)元素的有效范圍就收縮得很快字管,而不像順序查找那樣,每次僅能排除一個(gè)元素
func searchTargetIndex(_ nums:[Int] , _ target:Int) -> Int {
// 二分查找的基礎(chǔ) 建立在數(shù)組為有序數(shù)組上信不,也就是說(shuō)數(shù)組內(nèi)的數(shù)據(jù)要從小到大排列
// 定義雙指針嘲叔,begin為0左邊下標(biāo), end 最后一個(gè)下標(biāo)
var begin = 0 , end = nums.count - 1
while begin <= end {
//取中間下標(biāo)
let mid = begin + (end - begin) / 2
// 如果中間下標(biāo)小于查找目標(biāo)值抽活,那么左指針右移 擴(kuò)大搜索面積
if nums[mid] < target {
begin = mid + 1
}
// 如果中間下標(biāo)大于查找目標(biāo)值硫戈,那么右指針左移 縮小搜索面積
else if nums[mid] > target{
end = mid - 1
}
else{
return mid
}
}
return -1
}