本帖最後由 tonyh 於 2018-6-20 16:18 編輯
說明
如果搜尋的數列已經有排序,應該儘量利用它們已排序的特性,以減少搜尋比對的次數,這是搜尋的基本原則,二分搜尋法(Binary Search)是這個基本原則的代表。
解法
在二分搜尋法中,從數列的中間開始搜尋,如果這個數小於我們所搜尋的數,由於數列已排序,則該數左邊的數一定都小於要搜尋的對象,所以無需浪費時間在左邊的數;如果搜尋的數大於所搜尋的對象,則右邊的數無需再搜尋,直接搜尋左邊的數。
所以二分搜尋法,就是將數列不斷的分為兩個部份,每次從分割的部份中取中間數比對,反覆這個步驟直到比對成功。
範例
例如要搜尋92於以下的數列,首先中間數索引為(0+9)/2=4(索引由0開始):
[3 24 57 57 67 68 83 90 92 95]
由於67小於92,所以轉搜尋右邊的數列:
3 24 57 57 67 [68 83 90 92 95]
由於90小於92,再搜尋右邊的數列,這次就找到所要的數了:
3 24 57 57 67 68 83 90 [92 95]
優點
搜尋效率較佳
缺點
資料必須事先排序
範例練習
int data[9]= {5, 9, 13, 15, 17, 19, 25, 30, 45}; // 已排序資料
- #include<iostream>
- #include<cstdlib>
- using namespace std;
- int main()
- {
- int target;
- int data[9]= {5, 9, 13, 15, 17, 19, 25, 30, 45}; // 已排序資料
- int high=sizeof(data)/sizeof(int)-1;
- int low=0;
- int middle=0;
- int n=0;
-
- cout<<"請輸入要找尋的資料:";
- cin>>target;
- cout<<endl;
- while(low<=high)
- {
- n++;
- middle=(high+low)/2;
- cout<<"尋找區間:"<<low<<"("<<data[low]<<").."<<high<<"("<<data[high]<<"),中間:"<<middle<<"("<<data[middle]<<")"<<endl;
- if(target>data[middle])
- low=middle+1;
- else if(target<data[middle])
- high=middle-1;
- else
- break;
- }
-
- cout<<endl<<"經過"<<n<<"次的尋找"<<endl;
- if(target==data[middle])
- cout<<"您要找的資料在陣列中的第"<<middle<<"個位置";
- else
- cout<<target<<"不在陣列中";
- cout<<endl<<endl;
- system("pause");
- return 0;
- }
複製代碼 |