几种不同的二分查找
2017-08-22 19:43
309 查看
今天多校又卡在找下标上了,队友贡献了一发自己写的二分板子,感觉很好用。保存下来。
/*
几种二分方法整理
元素可以重复
*/
//lower_bound(num, num+size, x)-num:大于等于x的第一个数的下标
//upper_bound(num, num+size, x)-num:大于x的第一个数的下标
//1.求等于x的最小的index,不存在返回-1
int binary (int *num, int start, int end, int x) {
int l = start, r = end, ans=-1;
while(l <= r) {
int mid = (l+r) >> 1;
if(num[mid] == x) {
ans = mid;
r = mid - 1;
}
else if(num[mid] > x)
r = mid - 1;
else
l = mid + 1;
}
return ans;
}
//2.求等于x的最大的index,不存在返回-1
int binary (int *num, int start, int end, int x) {
int l = start, r = end, ans=-1;
while(l <= r) {
int mid = (l+r) >> 1;
if(num[mid] == x) {
ans = mid;
l = mid + 1;
}
else if(num[mid] > x)
r = mid - 1;
else
l = mid + 1;
}
return ans;
}
//3.求小于x的最大的index
int binary (int *num, int start, int end, int x) {
int l = start, r = end;
while(l <= r) {
int mid = (l+r) >> 1;
if(num[mid] >= x)
r = mid - 1;
else
l = mid + 1;
}
return r;
}
//4.求大于x的最小的index
int binary (int *num, int start, int end, int x) {
int l = start, r = end;
while(l <= r) {
int mid = (l+r) >> 1;
if(num[mid] <= x)
l = mid + 1;
else
r = mid - 1;
}
return l;
}
//5.求大于等于x的最小的index
int binary (int *num, int start, int end, int x) {
int l = start, r = end;
while(l <= r) {
int mid = (l+r) >> 1;
if(num[mid] >= x)
r = mid - 1;
else
l = mid + 1;
}
return l;
}
//6.求小于等于x的最大的index
int binary (int *num, int start, int end, int x) {
int l = start, r = end;
while(l <= r) {
int mid = (l+r) >> 1;
if(num[mid] <= x)
l = mid + 1;
else
r = mid - 1;
}
return r;
}
/*
几种二分方法整理
元素可以重复
*/
//lower_bound(num, num+size, x)-num:大于等于x的第一个数的下标
//upper_bound(num, num+size, x)-num:大于x的第一个数的下标
//1.求等于x的最小的index,不存在返回-1
int binary (int *num, int start, int end, int x) {
int l = start, r = end, ans=-1;
while(l <= r) {
int mid = (l+r) >> 1;
if(num[mid] == x) {
ans = mid;
r = mid - 1;
}
else if(num[mid] > x)
r = mid - 1;
else
l = mid + 1;
}
return ans;
}
//2.求等于x的最大的index,不存在返回-1
int binary (int *num, int start, int end, int x) {
int l = start, r = end, ans=-1;
while(l <= r) {
int mid = (l+r) >> 1;
if(num[mid] == x) {
ans = mid;
l = mid + 1;
}
else if(num[mid] > x)
r = mid - 1;
else
l = mid + 1;
}
return ans;
}
//3.求小于x的最大的index
int binary (int *num, int start, int end, int x) {
int l = start, r = end;
while(l <= r) {
int mid = (l+r) >> 1;
if(num[mid] >= x)
r = mid - 1;
else
l = mid + 1;
}
return r;
}
//4.求大于x的最小的index
int binary (int *num, int start, int end, int x) {
int l = start, r = end;
while(l <= r) {
int mid = (l+r) >> 1;
if(num[mid] <= x)
l = mid + 1;
else
r = mid - 1;
}
return l;
}
//5.求大于等于x的最小的index
int binary (int *num, int start, int end, int x) {
int l = start, r = end;
while(l <= r) {
int mid = (l+r) >> 1;
if(num[mid] >= x)
r = mid - 1;
else
l = mid + 1;
}
return l;
}
//6.求小于等于x的最大的index
int binary (int *num, int start, int end, int x) {
int l = start, r = end;
while(l <= r) {
int mid = (l+r) >> 1;
if(num[mid] <= x)
l = mid + 1;
else
r = mid - 1;
}
return r;
}
相关文章推荐
- 二分查找的几种不同的实现
- 几种二分查找算法的代码和比较
- 转:二分查找的3种不同情况详细介绍
- js实现常见的几种算法(数组去重、字符统计、二分查找等)
- [LeetCode]96 不同二分查找树
- 深入理解不同的二分查找C++
- Python 实现查找的几种类型 (线性查找,线性有序查找,线性查找最小值,二分查找)
- 二分查找求上下界的两种不同算法
- 几种二分查找算法的代码和比较
- 不同情况的二分查找详解
- 二分查找的几种方法对比,C++实现
- 常见几种二分查找
- 关于C++二分查找
- 二分查找
- Linux 下查找文件的几种方式
- STL之二分查找 (Binary search in STL)
- java单例模式的几种不同实现
- 折半(二分)查找
- Java排序算法和二分查找
- js 二分查找的实现