二分查詢也稱為折半查詢,是對有序元素查詢的一種演算法,在查詢的過程中,不斷的將搜尋長度減半,因此效率不錯。j**a的jdk提供了二分法查詢的演算法,使用的方法是arrays.binarysearch()。binarysearch()方法提供了多種資料型別的二分查詢,比如實現了int、float、double、char、byte和object型別,還提供了對泛型的支援。在j**aapi手冊中提供了介面說明,比如如下方法:
1以上是arrays類中提供的部分關於binanrysearch()方法的定義,對於不同型別來說,基本提供了兩種方法,第一種方法需要在呼叫時提供陣列、開始下標、結束下標和查詢的值,比如:static
int binarysearch(long a, int fromindex, int toindex, long
key)
2static
int binarysearch(long a, long
key)
3static
int binarysearch(object a, int fromindex, int
toindex, object key)
4static
int
binarysearch(object a, object key)
5static
int binarysearch(short a, int fromindex, int toindex, short
key)
6static
int binarysearch(short a, short
key)
7static
int binarysearch(t a, int fromindex, int toindex, t key, comparator super t>c)
8static
int binarysearch(t a, t key, comparator super t> c)
static另外一種查詢的方法是提供陣列和查詢的值即可,比如:int binarysearch(long a, int fromindex, int toindex, long key)
static對於這兩種搜尋方法,在j**a中提供了統一的呼叫方法,可以檢視其**,在j**a的安裝目錄下找到src.zip檔案,該檔案是j**a的部分原始碼。將src.zip檔案解壓縮,在j**a/util/arrays.j**a中可以找到以上兩個方法的實現,**如下:int binarysearch(long a, long key)
1從**中可以看到,兩個方法最後都呼叫了binarysearch0()方法,但是在第二個binarysearch()方法中呼叫了rangecheck()方法,該方法用於檢查陣列長度、開始下標和結束下標的正確性,rangecheck()方法的實現如下:public
static
int binarysearch(long a, long
key) 45
public
static
int binarysearch(long a, int fromindex, int
toindex,
6long
key)
1如果呼叫第乙個binarysearch()方法,陣列長度、開始下標和結束下標是方法中自行獲取的,因此不需要進行rangecheck(),而呼叫第二個binarysearch()方法時,陣列長度、開始下標和結束下標是呼叫時外部提供的,因此為了保證正確性進行了rangecheck()。/**2
* checks that and are in
3* the range and throws an exception if they aren't.4*/
5private
static
void rangecheck(int arraylength, int fromindex, int
toindex)
10if (fromindex < 0)
13if (toindex >arraylength)
16 }
二分法真正的實現是binarysearch0()方法,根據不同的資料型別,binarysearch0()方法也提供了多種過載,這裡只看long型別的實現,**如下:
1二分查詢的思路是從有序(從小到大)陣列的中間位置開始查詢,如果中間位置的數小於查詢的目標值,則查詢陣列中間值右側的部分,如果中間位置的數大於查詢的目標值,則查詢陣列中間值左側的部分,如果相等,則返回當前的下標,如果沒有找到則返回乙個負數。private
static
int binarysearch0(long a, int fromindex, int
toindex,
2long
key)
17return -(low + 1); //
key not found.
18 }
除了上面的實現外,還有一種針對泛型的binaryseach()的方法,如下:
1在上面兩個方法的定義中,最後乙個引數是乙個比較器,比較器的作用是比較兩個元素的大小用的,檢視以上兩個方法的實現,**如下:static
int binarysearch(t a, int fromindex, int toindex, t key, comparator super t>c)
2static
int binarysearch(t a, t key, comparator super t> c)
1以上兩個方法同樣呼叫了binarysearch0()方法,該binarysearch0()方法的實現**如下:public
static
int binarysearch(t a, t key, comparator super t>c) 45
public
static
int binarysearch(t a, int fromindex, int
toindex,
6 t key, comparator super t>c)
1觀察**的第12行,c是比較器,該比較器中提供了乙個compare()方法用來比較兩個元素的大小,如果midval比key小,compare返回負數,如果midval比key大,compare返回整數,如果midval和key相等,compare則返回0。private
static
int binarysearch0(t a, int fromindex, int
toindex,
2 t key, comparator super t>c)
6int low =fromindex;
7int high = toindex - 1;89
while (low <=high)
20return -(low + 1); //
key not found.
21 }
以上就是在學習arrays工具類的使用時,順便閱讀了它的實現,而剛好又能看懂,所以記錄在此!
迭代二分查詢二分查詢
在寫這篇文章之前,已經寫過了幾篇關於改迭代二分查詢主題的文章,想要了解的朋友可以去翻一下之前的文章 bentley在他的著作 writing correct programs 中寫道,90 的計算機專家不能在2小時內寫出完整確正的二分搜尋演算法。難怪有人說,二分查詢道理單簡,甚至小學生都能明確。不過...
二分查詢的平均查詢長度 二分查詢
資料的查詢在計算機的操作中非常常見,那麼我們應該怎樣在計算機中實現查詢操作呢?最簡單的一種方法 傻找 也就是乙個乙個的找,我們把陣列中的每個元素都和我們想要查詢的目標元素進行比對,看一下列表中是否有和這個元素相同的元素,如果我們想要尋找的那個目標元素在列表 現了,那麼就宣告查詢成功,這種演算法寫成 ...
二分查詢和遞迴的二分查詢
在乙個有序的陣列中查詢給定的資料項,把陣列衝中間分成兩半,然後看要查詢的資料項在陣列的哪一半,再次折半查詢。如下 public int find long searchkey else if lowerbound upperbound else private int recfind long se...