分治法 二分搜尋BinarySearch

2021-09-27 09:24:41 字數 1429 閱讀 2605

問題描述:

給定乙個數字,再給n個數字,要從這n個數找出這個給定的數字,最壞的情況,如果乙個乙個找,要猜n次才能成功。

其實我們沒有必要乙個乙個猜

,因為這些數字是有限的而且是有序的(我們給它們排個序),這是乙個典型的二分搜尋問題。我們可以用折半查詢的策略,每次和中間的元素比較,如果比中間的元素小,那麼要查詢的數字就在左半部分。反之,如果比中間的元素大,那麼要查詢的元素就在中間元素的右邊。

用乙個一維陣列s[ ]儲存資料。

設變數low和high為下界和上界。

middle為搜尋範圍的中間變數。

x是要查詢的資料。

初始化。設low=0。high=n-1。

middle=(low+high)/2。即查詢範圍的中間元素。

判定low判斷x與是s[middle]的關係,如果相等,那麼x=s[middle],搜尋成功,演算法結束;如果xs[middle],那麼令low=middle+1,然後重複2的步驟。

#include #include #include #include using namespace std;

const int m=1111111;

int x; //要查詢的數字

int n; //n個數字

int i; //迴圈

int s[m];//用來儲存數字串

int binarysearch(int n,int s,int x)

else if(x>n)

sort(s,s+n); //對存好的元素進行從小到大的排序

cout << "排序好的陣列是:" << endl;

for (i=0;i> x;

int number=binarysearch(n,s,x);

if(number==-1)

else

}return 0;

}

可以用遞迴呼叫自己來優化這個搜尋過程,那麼函式中就要加入low和high兩個變數。

int recursionbs(int x,int s,int low,int high)

int middle =(high+low)/2;

if (x==s[middle])

else if (x接下來就只要在main函式中原來對binarysearch(n.s.x)的呼叫改為 recursionbs(x,s,0,n-1)即可。

分治法 二分搜尋

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

分治法 二分搜尋

問題描述 又叫折半查詢,要求待查詢的序列有序。每次取中間位置的值與待查關鍵字比較,如果中間位置的值比待查關鍵字大,則在前半部分迴圈這個查詢的過程,如果中間位置的值比待查關鍵字小,則在後半部分迴圈這個查詢的過程。直到查詢到了為止,否則序列中沒有待查的關鍵字。package fenzi public c...

分治法 二分查詢

1 首先二分查詢滿足分治法的四個條件 1 原問題的解可以通過分解為若干個小的問題來解決 將原陣列序列可分解為兩個子串行 2 小的問題的解決方法和原問題的解決方法大致相似 都是確定乙個序列的上界和下界然後求得mid進行比較 3 小問題的解可以通過合併從而得到原問題的解 在子串行中可以更容易得到解從而r...