二分查詢只適用於從有序的數列中進行查詢
執行時間為對數時間o(log2
n\log_2
log2n
), 即最多隻需要log2
n\log_2
log2n
步。[0,99]中100個數進行查詢,需要26<100<27步,最多需要7步
思路:確定出歸條件,找到了或者start>end找到中間的數,如果比中間數大,則向左找
end = mid-1;
如果比中間數大,則向右找,知道找到位置;
start = mid +1;
public
class
erfen
// 遞迴方法
public
intsearchrec
(int start,
int end,
int target)
if(target < arr[
(end-start)/2
])return
searchrec
(start,end,target);}
else
return
searchrec
(start,end,target);}
}// 非遞迴實現
public
intsearch
(int start,
int end,
int target)
else
if(target < arr[
(end-start)/2
])else
}return-1
;}public
static
void
main
(string[
] args)
; erfen test =
newerfen
(arr)
;int index1 = test.
searchrec(0
,arr.length-1,
100)
;int index2 = test.
search(0
,arr.length-1,
100)
; system.out.
println
("index1="
+ index1);//
system.out.
println
("index2="
+ index2);//
}}
如果陣列中含有多個重複數字,上述方法只能實現,找到乙個數。如果想找到所有數字,這需要對上述方法進行優化。
思路:
當找到第乙個數時,不要進行return,而是將其儲存在乙個list中,並且對其進行左,右搜尋,直到下個數不滿足條件,或者index超過引索
public list searchrecplus
(int start,
int end,
int target)
reslist.
add(mid)
;int temp2 = mid +1;
while
(temp21&& arr[temp2]
==target)
return reslist;}if
(target < arr[
(end-start)/2
])return
searchrecplus
(start,end,target);}
else
return
searchrecplus
(start,end,target);}
}
二分查詢(遞迴 非遞迴)
二分查詢是一種查詢效率非常高的查詢演算法。又稱折半查詢。起初在資料結構中學習遞迴時實現二分查詢,實際上不用遞迴也可以實現,畢竟遞迴是需要開闢額外的空間的來輔助查詢。本文就介紹兩種方法 其缺點是要求待查表為有序表,且插入刪除困難。因此,折半查詢方法適用於不經常變動而查詢頻繁的有序列表。使用條件 查詢序...
二分查詢(非遞迴)
二分查詢也稱折半查詢 binary search 它是一種效率較高的查詢方法。但是,折半查詢要求線性表必須採用順序儲存結構,而且表中元素按關鍵字有序排列。如果待查序列為空,那麼就返回 1,並退出演算法 這表示查詢不到目標元素。如果待查序列不為空,則將它的中間元素與要查詢的目標元素進行匹配,看它們是否...
二分查詢 遞迴與非遞迴
最近做了一道題目,在弄清原理之後發現怎麼也過不去,找了幾個小時的bug,結果問題就出現在二分查詢的知識點上,暑假是有接觸過二分的題目,應該是沒有完全理解才會在昨天的那道題上碰釘子,藉此寫一下對二分的理解來鞏固鞏固以前的知識。一談起查詢,最先想到的無非是遍歷整組資料,複雜度為o n 但是對於一組有規律...