二分搜尋法

2021-10-03 07:08:49 字數 1843 閱讀 5654

一、問題描述:給定n個元素,這些元素是有序的,從陣列中查詢特定的元素x。

個人覺得二分法搜尋是分治法裡面最簡單的乙個搜尋演算法了,就是設定乙個下界low和上界high,然後再設乙個指標mid ( mid=(low+high)/2 ),然後隨著每次搜尋mid會在兩個區間之間( [low,mid-1] 和 [mid+1,high] )進行移動,對應的,low或者high也要相應地改變位置。**要注意這裡mid是陣列下標而不是乙個值。**如圖:

具體一點,就拿上面這個例子來說:首先,二分查詢是要在有序的條件下進行的,習慣就先把陣列定為公升序吧(呼叫sort()函式即可)。然後初始化完成之後,先判定low<=high是否成立,是,則判斷要找的元素x跟mid所對應的陣列元素的值是否相等(之後詳見演算法);否,則演算法結束。

二、核心演算法:

int

binarysearch

(int n,

int s,

int x)

else

if(x < s[mid]

)else

if(x > s[mid])}

return-1

;}

繼續思考,還有一種遞迴的方法可以用來表示二分搜尋,**如下:

int

recursionbs

(int s,

int x,

int low,

int high)

int mid =

(low + high )/2

;if(x == s[mid]

)else

if(x < s[mid]

)else

if(x > s[mid])}

//注釋可以參考上面的非遞迴注釋,是一樣的

結合到例項中的演算法:

#include

#include

#include

#include

using

namespace std;

const

int m =

1005

;int x,n,i;

int s[m]

;int

binarysearch

(int n,

int s,

int x)

else

if(x < s[mid]

)else

if(x > s[mid])}

return-1

;}intmain

(void

)sort

(s,s+n)

; cout<<

"排好序的陣列如下:"

<

for(i=

0; i

) cout<<

"請輸入要查詢的元素:"

; cin >> x;

i =binarysearch

(n,s,x);if

(i ==-1

)else

}return0;

}

時間複雜度為:o(nlogn)

不論什麼演算法,細節都還是挺多的,特別是關於陣列的,下標比較容易出錯,特別是要能敲出來並且正確執行,還得再細心

二分搜尋法

二分搜尋法,它充分利用了元素間的次序關係,採用分治策略,可在最壞的情況下用o log n 完成搜尋任務。它的基本思想是,將n個元素分成個數大致相同的兩半,取a n 2 與欲查詢的x作比較,如果x a n 2 則找到x,演算法運算終止。總結一下,二分搜尋需要注意的點有以下幾條 陣列一定記得要先排序!不...

二分法,二分搜尋

二分法是乙個應用很廣泛的演算法 好吧,剛說出這句話的時候,我查了一下資料,發現我了解的應用寥寥無幾.ok,既然不知道,那就下次補充把。咱們直接進入主題。二分法 bisection method 是一種方程式根的近似值求法。演算法 若要求已知函式f x 0的值則 1.先找出乙個區間 a,b 使得f a...

分治法 二分搜尋

二分搜尋技術是利用分治法思想的的典型例子 問題描述 給定已經排好序的n個元素a 0 n 1 要在這n個元素中找出乙個特定元素x的下標 首先比較容易想到的是遍歷這個n個元素,依次尋找,這樣做的話,最壞情況下需要做n次比較,時間複雜度為o n 這種方法沒有很好的利用排序這個性質。其次就是二分搜尋技術,二...