程式設計師必備十種演算法之 二分搜尋演算法

2021-10-04 03:20:17 字數 3372 閱讀 8271

請對乙個有序(在這講的是公升序)的陣列進行二分查詢,輸入乙個數看看該陣列是否存在該數,並且求出下標,如果沒有就返回提示沒有這個數。

1.首先確定該陣列的中間下標(在這用mid來表示)

mid = (left + right)/2

2.然後讓需要查詢的數(findval)與arr[mid]做比較:

1)findval > arr[mid],說明要查詢的數在mid的右邊,因此需要遞迴向右查詢

2)findval < arr[mid],說明要查詢的數在mid的左邊,因此需要遞迴向左查詢

3)findval == arr[mid],說明找到,返回

什麼時候應該結束遞迴:

1)找到就結束遞迴

2)遞迴完整個陣列,仍然沒有找到findval,也需要結束遞迴(即當left > right)

有人看到這裡可能就要疑問了?誒,憑什麼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.搜尋插入位置

程式設計師的十種級別

第一級 神人,天資過人而又是技術狂熱者同時還擁有過人的商業頭腦,遠矚,技術過人,大器也。如丁磊,求伯君。第二級 高人,有天賦,技術過人但沒有過人的商業頭腦,通常此類人不是頂尖黑客就是技術總監之流。第 牛人,技術精湛,熟悉行業知識,敢於創新,有自己的公司和軟體產品。第四級 工頭,技術精湛,有領導團隊的...

程式設計師的十種級別

第一級 神人,天資過人而又是技術狂熱者同時還擁有過人的商業頭腦,遠矚,技術過人,大器也。如丁磊,求伯君。第二級 高人,有天賦,技術過人但沒有過人的商業頭腦,通常此類人不 是頂尖黑客就是技術總監之流。第 牛人,技術精湛,熟悉行業知識,敢於創新,有自己的公司和軟 件產品。第四級 工頭,技術精湛,有領導團...

程式設計師的十種級別

第一級 神人,天資過人而又是技術狂熱者同時還擁有過人的商業頭腦,遠矚,技術過人,大器也。如 丁磊,求伯君。第二級 高人,有天賦,技術過人但沒有過人的商業頭腦,通常此類人不是頂尖黑客就是技術總監之流。第 牛人,技術精湛,熟悉行業知識,敢於創新,有自己的公司和軟體產品。第四級 工頭,技術精湛,有領導團隊...