標題:
二分搜尋法
[打印本頁]
作者:
tonyh
時間:
2018-6-20 14:11
標題:
二分搜尋法
本帖最後由 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}; // 已排序資料
[attach]4247[/attach]
[attach]4248[/attach]
#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;
}
複製代碼
歡迎光臨 種子論壇 | 高雄市資訊培育協會學員討論區 (http://seed.istak.org.tw/)
Powered by Discuz! 7.2