基本演算法(六)折半查詢
阿新 • • 發佈:2018-12-22
1.查詢過程
首先,假設數列是遞增的。查詢時,先查詢中間的數,若待差的數與中間的數相等,則查詢成功;若待查的數比中間的數小,則到陣列的前半部分查詢;否則待查數比中間數大,則到陣列的後半部分查詢。以同樣的方法在選定的區域中進行查詢,每次都會將查詢範圍縮小一半,較快便能找到目的數。直到將查詢區域縮小為0,如果找到了要查詢的數,則查詢成功,否則查詢失敗,表明有序數列中沒有要查詢的數。
2.演算法要求
數列必須單調遞增或單調遞減。
3.示例
在有序數列(11,22,33,44,55,66,77,88,99)中查詢66。
解答
用折半查詢(二分查詢)法要用到3個遊標變數:front,tail和mid。其中front和tail分別指示被查詢區域的頭尾位置,以此公式mid =(front + tail)/2來確定每次查詢區域的中間位置。
流程圖
圖解
程式碼實現
#include<iostream> using namespace std; /*折半查詢*/ int binsearch(int x,int arr[],int n) { int front = 0,tail = n-1,mid; while(front <= tail) { mid = (front + tail)/2; if(x < arr[mid]) tail = mid - 1; else if(x > arr[mid]) front = mid + 1; else return mid; } return -1; } int main() { int index,elem; int data[9] = {11,22,33,44,55,66,77,88,99}; cin>>elem; index = binsearch(elem,data,9); if(index >= 0) cout<<"要查詢的數在陣列中位置:"<<index<<endl; else cout<<"查無此數"<<endl; return 0; }
4.時間複雜度
T(n) = O(㏒2n)(以2為底,n的對數)