二分查找
来源:互联网 发布:核酸数据库 编辑:程序博客网 时间:2024/06/07 09:38
假设:递增数组,无相同元素
基本实现
在数组arr
中查找元素target
,若找到,则返回元素的位置,否则返回-1
int bSearch(vector<int> arr, int target) { int low=0, high=arr.size()-1; while(low<high) { int mid=low+((high-low)>>1); if(arr[mid]>target) high=mid-1; else if(arr[mid]<target) low=mid+1; else return mid; } return -1;}
找边界值
在数组arr
中找出第一个大于target
的元素,若存在,返回其位置,否则,返回-1
int bSearchUpperBound(vector<int> arr, int target) { int low=0, high=arr.size()-1; if(low>high || target>=arr[high]) return -1; int mid=low+((high-low)>>1); while(high>low) { if(arr[mid]>target) high=mid; else low=mid+1; mid=low+((high-low)>>1); } return mid;}
在数组arr
中找出第一个小于target
的元素,若存在,返回其位置,否则,返回-1
int bSearchLowerBound(vector<int> arr, int target) { if(low>high || target<=arr[low]) return -1; int mid=low+((high-low+1)>>1); while(low<high) { if(arr[mid]<target) low=mid; else high=mid-1; mid=low+((high-low+1)>>1); } return mid;}
在轮转后的有序数组上二分查找
int bSearchRotated(vector<int> arr, int target) { int low=0, high=arr.size()-1; while(low<high) { int mid=low+((high-low)>>1); if(target<arr[mid]) { if(arr[mid]<arr[high]) high=mid-1; else { if(target<arr[low]) low=mid+1; else high=mid-1; } } else if(arr[mid]<target) { if(arr[low]<arr[mid]) low=mid+1; else { if(arr[high]<target) high=mid-1; else low=mid+1; } } else return mid; } return -1;}
转自Ider
0 0
- 二分查找
- 二分查找
- 二分查找
- 二分查找
- 二分查找
- 二分查找
- 二分查找
- 二分查找
- 二分查找
- 二分查找
- 二分查找
- 二分查找
- 二分查找
- 二分查找
- 二分查找
- 二分查找
- 二分查找
- 二分查找
- Linux下查各子目录占磁盘大小
- 超好用的7个超实用的PHP函数
- 插入排序
- Amoeba 在Master/Slave结构下的读写分离
- Android学习笔记-Activity窗口的创建过程
- 二分查找
- Linux防火墙的设置
- JQUERY —— 绑定事件/获取下拉框的值
- 文章标题
- SUN dataset图像数据集下载
- 设置UIButton中的文字和图片,设置UILabel的文在显示不同颜色
- springMVC读取jason的支持
- RecyclerView的使用心得
- 谷歌chrome浏览器的源码分析(一)