一、問題描述:給定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 這種方法沒有很好的利用排序這個性質。其次就是二分搜尋技術,二...