相對於普通的順序查找,二分查找具備極好的效率。c++
使用條件:要求線性表必須採用 順序存儲結構 ,並且表中元素按關鍵字 有序排列 。指針
二分查找的時間複雜度:O(logn)code
手寫二分查找blog
#include <bits/stdc++.h> #define MAXN 1000005 int a[MAXN]; int main() { int n,m; std::scanf("%d%d",&n,&m); for(int i=1;i<=n;++i) std::scanf("%d",&a[i]); for(int i=1;i<=m;++i) { int l=1,r=n,x; std::scanf("%d",&x); //二分部分 while(r>=l)//= { int mid=l+r>>1; if(a[mid]<x)l=mid+1; //+-對稱 else r=mid-1; } if(a[l]==x) std::printf("%d ",l); //l或r均可以 else std::printf("-1 "); } return 0; }
STL lower_bound模板it
lower_bound:二分查找,找出第一個大於等於指定數的位置(迭代器)。若是沒有找到,返回最後一個數據的後一個位置。模板
#include <bits/stdc++.h> #define MAXN 1000005 int a[MAXN]; int main() { int n,m; std::scanf("%d%d",&n,&m); for(int i=1;i<=n;++i) std::scanf("%d",&a[i]); for(int i=1;i<=m;++i) { int x; std::scanf("%d",&x); int j=std::lower_bound(a+1,a+n+1,x)-a; //指針減,獲得下標 if(a[j]!=x) std::printf("-1 "); else std::printf("%d ",j); } return 0; }
手寫二分的測評結果:
lower_bound的測評結果:
class
對比能夠看出,手寫二分的時間是略快於lower_bound的。說明lower_bound的時間複雜度常數較大。效率
但lower_bound的代碼相對於手寫二分簡單。二者各有利弊。迭代器
作題感悟:im