給定乙個陣列,我們要查詢當前資料在陣列中的位置,雖然可以使用迴圈乙個個遍歷,但是由於要使**執行時間盡可能的小,所以我們要採用二分法來查詢。
先上**:
public
class
binarysearch
else
if(k > arr[m]
)else
}return-1
;}public
static
void
main
(string[
] args),15
)); system.out.
println
( bs.
binarysearch
(new
int,
-2))
; system.out.
println
( bs.
binarysearch
(new
int,
101));
system.out.
println
( bs.
binarysearch
(new
int,
13));
system.out.
println
("*****=");
system.out.
println
("testing empty or singleton data.");
system.out.
println
( bs.
binarysearch
(new
int,
13));
system.out.
println
( bs.
binarysearch
(new
int,
13));
system.out.
println
( bs.
binarysearch
(new
int,
13));
system.out.
println
("*****=");
system.out.
println
("testing data of size 2.");
system.out.
println
( bs.
binarysearch
(new
int,
13));
system.out.
println
( bs.
binarysearch
(new
int,
12));
system.out.
println
( bs.
binarysearch
(new
int,
11));
}
當使用二分查詢的時候有幾個注意點:
1、當前資料長度是否大於1。
2、陣列的長度範圍如何去定義。
3、在使用二分的時候,如果陣列長度過大,陣列收尾相加資料過大,導致資料溢位咋辦。
解決 第乙個問題:
我們首先判斷陣列的尾減去陣列的頭看是否大於"0"
第二個問題:
我們將陣列.length
當成陣列的尾,而不是陣列.length-1
,大家都知道陣列下標是從"0"開始的,但是為什麼不用陣列.length-1
呢?
我們直接使用陣列.length
的時候可以形成乙個左閉右開區間,方便陣列相加。如:[a,b)+[b,c) =[a,c)
而且我們直接使用陣列.length
的時候判斷左邊的時候直接小於就行,不用再去判斷等於條件。
第三個問題:
c = ( a + b ) / 2
當a和b過大的時候,a + b
的資料就更大,導致資料溢位咋辦,這個時候我們選擇使用
c = a + (b - a) / 2
來解決這個問題。
上面**執行結果:
python中二分查詢
二分查詢也稱折半查詢,它的效率較高。但是二分查詢要求線性表必須採用順序儲存結構,而且表中元素按關鍵字有序排列。寫二分查詢時有兩個方法,乙個是用遞迴,乙個不用遞迴。用遞迴的方法如下 coding utf 8 def binary search alist,item 二分查詢。遞迴法 n len ali...
STL中二分查詢
偶然遇到了一些問題,記錄一下 標頭檔案 include 1.binary search 查詢某個元素是否出現。函式原型 bool lower bound forwarditer first,forwarditer last,const tp val 函式功能 在陣列中以二分法檢索的方式查詢,若在陣列...
標準庫中二分查詢演算法
標準庫中二分搜尋演算法 每個演算法都提供兩個版本,第乙個版本用元素型別的小於運算子 來檢測元素,第二個版本則使用給定的比較操作。給定的比較操作可以是函式物件 lambda表示式 定義函式呼叫操作符類的物件。lower bound beg,end,val lower bound beg,end,val...