二分查詢/二分搜尋(binary_search)詳解
阿新 • • 發佈:2019-01-31
前提:
1.不考慮超大資料情況。
2.對於二分查詢/搜尋,要求待查表為有序表。
程式碼:
1.遞迴方式:
#include<iostream> using namespace std; int binary_search(int a[],int h,int t,int value); int main() { int a[11]={0,1,2,3,4,5,6,7,8,9,10}; int len=sizeof(a)/sizeof(a[0]); int result = binary_search(a,0,len-1,10); cout<<result<<endl; } int binary_search(int a[],int h,int t,int value) { if(h>t) { return -1; } int mid=(h+t)/2; if(value<a[mid]){ binary_search(a,h,mid-1,value); }else if(value>a[mid]){ binary_search(a,mid+1,t,value); }else{ return mid; } }
2.非遞迴方式:
#include<iostream> using namespace std; int search_binary(int a[],int low,int high,int value); int main() { int a[11]={0,1,2,3,4,5,6,7,8,9,10}; int len=sizeof(a)/sizeof(a[0]); int result=search_binary(a,0,len-1,2); cout<<result<<endl; } int search_binary(int a[],int low,int high,int value) { int middle=0; while(low<high) { middle=(low+high)/2; if(value>a[middle]) { low=middle+1; }else if(value<a[middle]){ high=middle-1; }else{ return middle; } } return -1; }
演算法分析:
1.時間複雜度:
從二分查詢的過程來看,每次比較目標值和當前序列中間元素的值後,都會將當前序列一分為二,繼續在分好的序列中查詢。序列的變化其實就是一個二叉樹的結構。在每一層上面,執行的比較操作都相同,消費時間設為C。 對於一個二叉樹,深度為lgn+1。所以時間總量為:T(n)=Clgn+C。
時間複雜度為:O(lgn)
2.用法解析:
優點是比較次數少,查詢速度快,平均效能好;其缺點是要求待查表為有序表,且插入刪除困難。因此,折半查詢方法適用於不經常變動而查詢頻繁的有序列表。