折半查詢(非遞迴)
阿新 • • 發佈:2018-12-03
設有n個數據儲存於有序資料表中,在進行折半查詢之前,先找出資料表中的正中元素的下標mid,利用其關鍵碼L.Data[mid]與定值x作比較。
若x.key=L.Data[mid].key,查詢成功,返回其下標mid並報告成功;
若x.key<L.Data[mid].key,則縮小查詢範圍到資料表的左側,繼續進行查詢;
若x.key>L.Data[mid].key,則縮小查詢範圍到資料表的右側,繼續進行查詢;
如果查詢範圍縮小到一個元素仍無法匹配資料,則查詢失敗;
折半查詢可用遞迴演算法和非遞迴演算法實現;
折半查詢的實現程式碼如下:
#include<iostream> using namespace std; #define MAXSIZE 100 typedef int DataType; typedef struct{ DataType Data[MAXSIZE]; int length; }OrderList; void CreateList(OrderList &L) //資料表建立函式 { cout<<"請輸入有序表長度:"<<endl; cin>>L.length; cout<<"請輸入有序表:"<<endl; for(int i=0;i<L.length;i++) { cin>>L.Data[i]; } } int Binsearch(OrderList &L) //折半查詢 { DataType x; cout<<"請輸入需要查詢的資料:"<<endl; cin>>x; int left,right,mid,s; left=0; right=L.length-1; while(left<=right) { mid=(left+right)/2; s=mid; if(L.Data[mid]==x) return mid; else if(x<L.Data[mid]) right=mid-1; else left=mid+1; } if(s=left) { cout<<"查詢失敗!!!"<<endl; return -1; } } int main() { OrderList L; CreateList(L); int n=Binsearch(L); cout<<"需要查詢的資料位置為:"<<endl; cout<<n+1<<endl; return 0; }