8.2.2 折半查詢法
阿新 • • 發佈:2018-12-25
折半查詢法又稱為二分查詢法,這種方法對待查詢的列表有兩個要求:
①必須採用順序儲存結構
②必須按關鍵字大小有序排列
演算法思想:首先,將列表中間位置記錄的關鍵字與查詢關鍵字比較,如果兩者相等,則查詢成功;否則利用中間位置記錄將表分成前、後兩個子表,如果中間位置記錄的關鍵字大於查詢關鍵字,則進一步查詢前一子表,否則進一步查詢後一子表。重複以上過程,直到找到滿足條件的記錄,使查詢成功,或直到子表不存在為止,此時查詢不成功。
折半查詢法的優點是比較次數少,查詢速度快,平均效能好;其缺點是要求待查表為有序表,且插入刪除困難。因此,折半查詢法適用於不經常變動而查詢頻繁的有序列表。
折半查詢法——非遞迴
#include<iostream> using namespace std; int main() { int num=0; cout<<"請輸入列表中資料元素的個數"<<endl; cin>>num; int arr[num]; cout<<"請依次輸入"<<num<<"個數據"<<endl; for(int i=0;i<num;i++) { cin>>arr[i]; } int low=0,high=num-1; cout<<"請輸入要查詢的資料元素的值"<<endl; int key=0; cin>>key; int mid=0; while(low<=high) { mid=(low+high)/2; if(arr[mid]==key) { cout<<"資料元素"<<key<<"位於第"<<mid+1<<"個"<<endl; return mid+1; } else if(arr[mid]>key) { high=mid-1; } else { low=mid+1; } } cout<<"沒有找到所要查詢的資料元素"<<endl; return 0; }
測試結果:
折半查詢法——遞迴
#include<iostream> using namespace std; int search(int *arr,int low,int high,int key); int main() { int num=0; cout<<"請輸入列表中資料元素的個數"<<endl; cin>>num; int arr[num]; cout<<"請依次輸入"<<num<<"個數據"<<endl; for(int i=0;i<num;i++) { cin>>arr[i]; } int low=0,high=num-1; cout<<"請輸入要查詢的資料元素的值"<<endl; int key=0; cin>>key; int result=search(arr,low,high,key); if(result!=0) { cout<<"資料元素"<<key<<"位於第"<<result<<"個"<<endl; } else { cout<<"沒有找到所要查詢的資料元素"<<endl; } return 0; } int search(int *arr,int low,int high,int key) { if(low>high) { return 0; } int mid=(low+high)/2; if(arr[mid]==key) { return mid+1; } else if(arr[mid]>key) { search(arr,low,mid-1,key); } else { search(arr,mid+1,high,key); } }
測試結果: