二分查詢的遞迴/非遞迴方式C++實現
阿新 • • 發佈:2019-02-20
二分查詢又稱折半查詢,優點是比較次數少,查詢速度快,平均效能好;其缺點是要求待查表為有序表,且插入刪除困難。因此,折半查詢方法適用於不經常變動而查詢頻繁的有序列表。時間複雜度為O(logN)
二分查詢就是將查詢的鍵和子陣列的中間鍵作比較,如果被查詢的鍵小於中間鍵,就在左子陣列繼續查詢;
如果大於中間鍵,就在右子陣列中查詢,否則中間鍵就是要找的元素。
二分查詢可以用遞迴方式或非遞迴方式實現;
另外二分查詢還有一些變種;例如查詢第一個與key相等的元素等,參考二分查詢的一些變種。#include <iostream> #define MAX 100 using namespace std; int binary_search(int a[], int nLength, int key) { int left = 0; int right =nLength -1; while(left<= right) { int mid = (left+right)/2; if (a[mid]== key) return mid; else if(a[mid]> key) right =mid-1; else if(a[mid]< key) left = mid+1; } return -1; } //非遞迴方式 int bin_search(int b[],int left, int right, int key) { while(left <= right) { int mid = (left+right)/2; if (b[mid]== key) return mid; else if (b[mid]>key) return bin_search(b,left,mid-1,key); else if (b[mid]<key) return bin_search(b,mid+1,right,key); } return -1; //遞迴方法 } int main() { int a[]={0,1,2,3,4,5,6,7,8,9}; int key= 5; int res1 =binary_search(a,sizeof(a)/sizeof(int),key) +1; //目標5的位置 cout<<"key的位置為"<<res1<<endl; //system("pause"); cout<<"換種方法,按enter鍵繼續"<<endl; cin.get(); int res2 = bin_search(a,0,sizeof(a)/sizeof(int)-1,key) +1; cout<<"key的位置為"<<res2<<endl; }