請對乙個有序(在這講的是公升序)的陣列進行二分查詢,輸入乙個數看看該陣列是否存在該數,並且求出下標,如果沒有就返回提示沒有這個數。
1.首先確定該陣列的中間下標(在這用mid來表示)
mid = (left + right)/2
2.然後讓需要查詢的數(findval)與arr[mid]做比較:
1)findval > arr[mid],說明要查詢的數在mid的右邊,因此需要遞迴向右查詢
2)findval < arr[mid],說明要查詢的數在mid的左邊,因此需要遞迴向左查詢
3)findval == arr[mid],說明找到,返回
什麼時候應該結束遞迴:有人看到這裡可能就要疑問了?誒,憑什麼left > right,就結束遞迴了?你說結束就結束是麼?別急,看完下面你就明白了(實在不明白的話,可以自己選乙個小一點的陣列,自己推一遍,我一開始也是一頭霧水,後面自己推了一遍過程就很清晰了)1)找到就結束遞迴
2)遞迴完整個陣列,仍然沒有找到findval,也需要結束遞迴(即當left > right)
由題意,在這講的是公升序(降序相反),我們可以知道當尋找乙個數時,總要要移動 left 或 right 的下標。
例如:向左遞迴時,我們left不變,right等於mid-1(相當於向左移動)
向右遞迴時,我們right不變,left等於mid+1(相當於向右移動)
只要陣列不是無限大的,那麼 left 一直向右移動,right 一直向左移動,總有一次當 left > right 時代表所有數都已經找完了,沒有找到,這時候就應該停止遞迴,返回-1,提示我們沒有找到這個值了。
public
class
binarysearch
;int index =
binarysearch
(arr,
0,arr.length-1,
99); system.out.
printf
("index:"
+index);}
public
static
intbinarysearch
(int
arr,
int left,
int right,
int findval)
int mid =
(right + left)/2
;int midval = arr[mid]
;//找到就返回下標
if(findval > midval)
else
if(findval < midval)
else}}
>>index:
8
若陣列為,當乙個有序陣列中,有多個相同的數值時如何將所有的數值都查詢到,例如這裡的元素666。
1.我們用乙個arraylist來接收要找的所有相同數值的索引
2.在找到mid索引值時,不要立刻返回
3.向mid索引值的左邊掃瞄,將所有滿足666元素的下標,加入到集合arraylist中
4.向mid索引值的右邊掃瞄,將所有滿足666元素的下標,加入到集合arraylist中
public
class
binarysearch2
; list
resindexlist =
binarysearch
(arr,
0,arr.length-1,
666)
; system.out.
printf
("resindexlist:"
+ resindexlist);}
public
static list
binarysearch
(int
arr,
int left,
int right,
int findval)
int mid =
(left + right)/2
;int midval = arr[mid];if
(findval > midval)
else
if(findval < midval)
else
//否則就放入進集合中
resindexlist.
add(temp)
; temp -=1;
} resindexlist.
add(mid)
;//將mid放入集合中
temp = mid +1;
//向mid右邊掃瞄
while
(true
)//否則放入集合中
resindexlist.
add(temp)
; temp +=1;
}return resindexlist;}}
}>>resindexlist:[4,
5,6]
二分查詢法的執行時間為對數時間o(log2n),即查詢到需要的目標位置最多隻需要 log2n 步,假設從[0,99]的數列(100個數,即 n = 100)中尋到目標元素30,則需要查詢步數為 log2 100,即最多需要查詢7次
(2^6 < 100 < 2^7)
同遞迴的思路一樣,唯一不同的就是邊界條件變為了left < = rigth
public
static
void
main
(string[
] args)
;int index =
binaryserch
(arr,99)
; system.out.
printf
("index:"
+ index);}
public
static
intbinaryserch
(int
arr,
int target)
else
if(target < arr[mid]
)else
}return-1
;//-1代表沒找到
}}
二分查詢我們就講到這裡,下面我會更新在leetcode裡所歸為二分查詢型別的演算法題型解法:
35.搜尋插入位置
程式設計師的十種級別
第一級 神人,天資過人而又是技術狂熱者同時還擁有過人的商業頭腦,遠矚,技術過人,大器也。如丁磊,求伯君。第二級 高人,有天賦,技術過人但沒有過人的商業頭腦,通常此類人不是頂尖黑客就是技術總監之流。第 牛人,技術精湛,熟悉行業知識,敢於創新,有自己的公司和軟體產品。第四級 工頭,技術精湛,有領導團隊的...
程式設計師的十種級別
第一級 神人,天資過人而又是技術狂熱者同時還擁有過人的商業頭腦,遠矚,技術過人,大器也。如丁磊,求伯君。第二級 高人,有天賦,技術過人但沒有過人的商業頭腦,通常此類人不 是頂尖黑客就是技術總監之流。第 牛人,技術精湛,熟悉行業知識,敢於創新,有自己的公司和軟 件產品。第四級 工頭,技術精湛,有領導團...
程式設計師的十種級別
第一級 神人,天資過人而又是技術狂熱者同時還擁有過人的商業頭腦,遠矚,技術過人,大器也。如 丁磊,求伯君。第二級 高人,有天賦,技術過人但沒有過人的商業頭腦,通常此類人不是頂尖黑客就是技術總監之流。第 牛人,技術精湛,熟悉行業知識,敢於創新,有自己的公司和軟體產品。第四級 工頭,技術精湛,有領導團隊...