資料結構用遞迴和非遞迴方法實現二分查詢法
阿新 • • 發佈:2019-01-30
二分查詢法說的通俗一點就是折半查詢,每查詢一次,所對應的元素就會減少一半,所以這種方法的優點就是比較的次數少,查詢的速度快。但其最大的缺點就是插入資料比較困難。所以在面對資料一直會發生變動的列表,就不推薦用二分查詢法了。
那麼下面就來實際介紹一下這種方法,如果一個表中的元素按照由小到大來排列,找到表中間位置,並與查詢的key值比較,如若相等,就說明查詢成功。如果不相等,就一中間位置為準將表分為前後兩部分,然後比較key值與中間值的大小,key值大,則在後半部分表中進一步查詢,反之,則在前半部分表中查詢。一直按此方法迴圈查詢下去,要麼查到成功,要麼就說明表裡沒有和key值相等的資料,即查詢失敗。
下面就給大家分別介紹用遞迴和非遞迴方法實現二分查詢法
1、用遞迴方式來實現
#include<iostream> using namespace std; int Find(int ar[],int low, int high, int key) { if(low > high) return -1; int mid = (low+high)/2; if(ar[mid] == key) return mid; else if(key < ar[mid]) return Find(ar,low,mid-1, key); else return Find(ar,mid+1, high, key); } void main() { int ar[] = {1,23,45,67,90,123,345,678,900,1000}; int key; cout<<"input key:>"; cin>>key; int n = sizeof(ar) / sizeof(int); int low = 0; int high = n-1; int index = Find(ar,low,high,key); cout<<"index = "<<index<<endl; }
2、用非遞迴方式來實現
那麼本次的分享也就到這了,希望能幫到大家#include<iostream> using namespace std; int Find(int ar[], int n, int key) { int low = 0; int high = n-1; int mid; while(low <= high) { mid = (low+high)/2; if(ar[mid] == key) return mid; else if(key < ar[mid]) high = mid-1; else low = mid+1; } return -1; } void main() { int ar[] = {1,23,45,67,90,123,345,678,900,1000}; int key; cout<<"input key:>"; cin>>key; int n = sizeof(ar) / sizeof(int); int index = Find(ar,n,key); cout<<"index = "<<index<<endl; }