首页 > 代码库 > 二分查找小结
二分查找小结
先看二分查找的一般写法
#include<stdio.h> #include<math.h> #include<string.h> #include<stdlib.h> #include<algorithm> #include<vector> using namespace std; #define N 100005 #define ll __int64 int n,a[N]; int findd(int x) { int l=0,r=n-1; while(l<=r) { int mid=(l+r)>>1; if(a[mid]==x) return mid; if(a[mid]>x) r=mid-1; else l=mid+1; } return -1; //没有找到 } int main() { int i,m,x,t; while(~scanf("%d",&n)) { for(i=0;i<n;i++) { scanf("%d",&a[i]); } sort(a,a+n); scanf("%d",&m); while(m--) { scanf("%d",&x); t=findd(x); printf("%d\n",t); } } return 0; }
一般的二分查找只能找到目标值,但是当目标值重复出现时返回的下标就不确定,下面的写法可以返回最先出现的目标值的下标。当目标值未出现时,返回比目标值大的那个元素的下标或者返回边界值n;
#include<stdio.h> #include<math.h> #include<string.h> #include<stdlib.h> #include<algorithm> #include<vector> using namespace std; #define N 100005 #define ll __int64 int n,a[N]; int findd(int x) { int l=0,r=n-1; while(l<=r) { int mid=(l+r)>>1; if(a[mid]>=x) r=mid-1; else l=mid+1; /*if(a[mid]<x) //这种写法也上面同样效果 l=mid+1; else r=mid-1;*/ } return l; //返回目标值的下标,若有多个值相同,返回最先出现的下标。 } int main() { int i,m,x,t; while(~scanf("%d",&n)) { for(i=0;i<n;i++) { scanf("%d",&a[i]); } sort(a,a+n); scanf("%d",&m); while(m--) { scanf("%d",&x); t=findd(x); printf("%d\n",t); } } return 0; }
二分查找小结
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。