二分查找小结
2014-12-19 12:55
239 查看
先看二分查找的一般写法
一般的二分查找只能找到目标值,但是当目标值重复出现时返回的下标就不确定,下面的写法可以返回最先出现的目标值的下标。当目标值未出现时,返回比目标值大的那个元素的下标或者返回边界值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 ; 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 ; 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; }
相关文章推荐
- 冒泡排序,选择排序,二分查找小结
- 算法入门---java语言实现的二分查找小结
- 二分查找小结
- 二分查找小结
- 二分查找代码
- 算法题:二分查找的溢出考虑
- 二分--LIGHTOJ 1088查找区间(水题)
- 二分查找+spfa(洛谷1948 [USACO08JAN]电话线Telephone Lines) 4000
- 分治-二分查找
- 基础算法 - 二分查找 / 二分答案入门
- Can you solve this equation?(二分查找的简单应用)
- 二分查找
- uva 1152 二分查找+中途相遇法
- 二分查找之变形
- 二分查找的实现
- hiho 37 二分查找k小数
- HDU 3763 CD【二分查找】
- 我爱蜜袋鼯 (二分查找再进行贪心判断)
- 模板--二分查找