二分查找算法

复杂度log⁡2N\log_2Nlog2​N
二分查找的前提是待查找的序列必须是有序的。另外一点,C++中的序列都是前闭后开的。如果使用STL,默认是递增顺序,递减的顺序需要自定义比较函数。二分查找可以自己实现或者使用STL的std::binary_search()实现,后者只能给出需要查找的元素是否在某序列中,返回bool值。然而,当我们需要知道元素的具体位置时,需要自己写一个二分查找算法。一下给出了两种方式,注意自定义函数的区间调整。

如果一个容器是有序的,而且元素可以使用==运算符进行比较,那么完全可以使用库函数lower_bound()执行二分查找,函数返回第一个大于等于目标元素的位置,如果所有元素都小于目标元素的迭代器,则返回尾后替代器;同时注意upper_bound()函数,该函数也是执行二分查找,不过是返回第一个大于目标元素的迭代器。利用upper_boundlower_bound之差可以记录相等元素的个数。。

不过,我们要自己掌握这种算法,自己写这种算法时,与STL的区别在于右侧也是闭区间,这样比较好记,而且容易寻找下标的规律。算法终止条件的核心是下界大于上界。下面给出代码:

#include <iostream>
#include <vector>
using namespace std;template<typename T>
int BinSearch(vector<T>vec, T key) {if(vec.empty()) {return -1;}int low = 0, high = vec.size() - 1;while(low <= high) {int mid = low + (high - low) / 2;if(vec[mid] == key) {return mid;} else if(vec[mid] > key) {high = mid - 1;} else {low = mid + 1;}}return -1;
}int main() {return 0;
}

二分查找下标的规律总结:

  • 如果可以找到目标,分为两种情况,这两种情况对于子区间同样适用:

    • 区间的两侧是目标:low=high=midlow=high=midlow=high=mid
    • 恰好是mid=low+(low+high)/2mid=low+(low+high)/2mid=low+(low+high)/2,此时三者都不变
  • 如果找不到目标,则low=high+1low=high+1low=high+1,此时的 midmidmid等于lowlowlow或者highhighhigh,由具体的运算情景决定
  • 如果high=low+1high=low+1high=low+1时,在这里先不论是否有目标值,此时一定有:mid=lowmid=lowmid=low。假设我们此时还没找到元素,那么如果目标值小于midmidmid指示值,则highhighhigh移动向lowlowlow;否则lowlowlow移动向highhighhigh;最终mid=high=lowmid=high=lowmid=high=low。

二分查找以及数组下标的移动规律相关推荐

  1. 挑战程序设计竞赛部分题目选择排序、二分查找找出下标、深度优先算法、求三角形max周长、蚂蚁算法、操作excel

    首先提供帮助类 可能这个类还需要更新 .求最大值.求最小值.选择排序.二分查找找出下标.二分查找排好序列里面是否有那个值 public class Util {//求最大值public static ...

  2. java 二分查找_Java数组之Arrays方法

    Java数组之Arrays方法,拉勾IT课小编为大家分析,JAVA数组的一些方法,提升开发水平,增强技术开发水平,不断提升个人的技术能力,在对于java开发领域,很多人都从基础做起. 1. 数组的工具 ...

  3. 【leetcode】644 最大子段和 II(二分查找,数组)

    题目链接:https://leetcode-cn.com/problems/maximum-average-subarray-ii/ 题目描述 给定一个包含 n 个整数的数组,找到最大平均值的连续子序 ...

  4. Java的Arrays类常用方法#冒泡排序#二分查找法#数组转换集合

    数组高级冒泡排序 方法一:(冒泡排序) /** 冒泡排序* 1,返回值类型,void* 2,参数列表,int[] arr* * 第一次:arr[0]与arr[1],arr[1]与arr[2],arr[ ...

  5. 开花(在b数组中二分查找a数组元素)

    注意: 代码一:二层循环暴力查找超时 代码二(最棒):借用STL set中的count()方法快速搞定,且没有超时so,集合查询应该很快注意:count()时间复杂度是线性变换的最坏的情况为O(n)s ...

  6. 使用选择排序和二分查找在数组中查找数据

    <Java实用教程(第5版)微课版> ISBN 978-7-302-46425-9 p29 例子5 能判断用户输入的一个整数是否在已知的数组中.程序效果如下图: 输入整数,程序判断该整数是 ...

  7. 二分查找 —— 有序数组不小于(不大于)某数的第一个(最后一个)元素

    1. 不小于某数的第一个元素 def bisearch(l, e, lo, hi):while lo < hi:mi = (lo + hi)//2if e > l[mi]: lo = mi ...

  8. leetcode算法算题记录-数组--二分查找

    public class 二分查找 {//注: 数组为有序数组且数组中无重复元素是使用二分法的前提//704.二分查找 简单//给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 ta ...

  9. leetcode练习一:数组(二分查找、双指针、滑动窗口)

    文章目录 一. 数组理论基础 二. 二分查找 2.1 解题思路 2.2 练习题 2.2.1 二分查找(题704) 2.2.2 搜索插入位置(题35) 2.2.3 查找排序数组元素起止位置(题34) 2 ...

最新文章

  1. java课设推荐,《Java程序设计》课程设计报告推荐.docx
  2. jquery通过val()取不到textarea中的值
  3. 数据库集群和高可用解决方案
  4. 快速搭建 Serverless 人脸识别离线服务
  5. Python 优先级
  6. [三]RabbitMQ-客户端源码之ChannelManager
  7. if判断用户名 linux,linux shell 之if-------用if做判断
  8. sharepointa嵌入HTML网页,显示存储在SharePoint文档文件夹中的HTML页面
  9. 2020 中国开源年会(COSCon'20)再启程:开源向善(Open Source for Good)
  10. 太原市中考计算机考试系统,太原中考报名系统
  11. idea(mac) 使用收集
  12. A few thoughts about Open Source Software
  13. delphi 调试控件代码_机器人调试(六十七)
  14. (转)两大量化交易巨头“抱团取暖”:Virtu14亿美元收购骑士资本
  15. python 执行py文件_python入门篇:python怎么运行?python如何运行py文件?
  16. 专业抠图软件Super PhotoCut Pro for Mac
  17. 高级钟点秘书——会议安排
  18. Rope3d数据集分析
  19. 网站一直不被收录怎么办,让网站收录更好的五个方法
  20. lucas–kanade_Lucas–Kanade光流算法学习

热门文章

  1. C语言编程规范(排版)
  2. 【已解决】ffmpy3.FFExecutableNotFoundError: Executable ‘ffmpeg‘ not found
  3. windows下编写dll
  4. Python3.x中set()集合的使用方法
  5. AttributeError: module ‘cv2.cv2‘ has no attribute ‘bgsegm‘
  6. SQL server 数据库基础知识之数据类型
  7. 洛谷P2881 [USACO07MAR]排名的牛Ranking the Cows(bitset Floyd)
  8. 计算机图形学(一) 视频显示设备_3_随机扫描显示器
  9. 《程序是怎样跑起来的》读书笔记
  10. java 8-6 抽象的练习