OI中的二分查找

简介: 简要介绍二分查找的优势,思想与做法。

二分查找

  • 引入
    试想这么一个场景:你在翻阅花名册(按照字母顺序排列)中寻找一位姓氏首字母为P的同学的名字时,是会从花名册的第一行开始寻找,还是会从花名册大约中间部位开始寻找?
    相信所有人都会选择后者的方法,因为这种方法的时间复杂度会低很多,其实这就运用了二分查找的思想。

  • 正文
    再次分析一下上文引入的例子,具体化我们要做的事:首先从中间将花名册分为两部分,比较要找的对象和分割处的名字。如果分割处的名字就是要找的对象,那么寻找过程结束。如果名字在分割点的前面,那么对前面那一部分再进行寻找,反之则反。

  • 核心代码

    int name_find(int q){
    int l=1,r=n+1;//根据实际情况判定范围区间
    while(l<=r){ //这里是判定条件,要根据实际情况进行调整
      int mid=l+(r-1)/2; //避免数据溢出,当然如果确定不会溢出也可以直接用算数平均值
      if(a[mid]>=q) r=mid+1; //同理需要根据实际情况判定
      else l=mid+1;
      }
    if(a[l]==q) return l;
    else return -1;
    }
    
目录
相关文章
|
8月前
|
存储 机器学习/深度学习 算法
并查集(Union Find)
并查集(Union Find)
69 3
|
8月前
|
搜索推荐 算法 Java
sort-08-counting sort 计数排序
这是一个关于排序算法的系列文章摘要。文章详细介绍了多种排序算法,包括冒泡排序、快速排序、选择排序、堆排序、插入排序、希尔排序、归并排序、计数排序、桶排序以及大文件外部排序。计数排序是一种线性时间复杂度的稳定排序算法,由 Harold H. Seward 在1954年提出。基础版计数排序通过创建一个与最大元素等长的新数组来统计每个元素出现的次数,然后填充排序结果。改良版则考虑了空间浪费问题,通过找出最小值来减少数组长度。此外,还提出了使用 TreeMap 来扩展排序算法以适应非数字元素的情况。
|
存储 算法 Java
基数排序详解(Radix sort)
基数排序详解(Radix sort)
129 0
|
搜索推荐 JavaScript 前端开发
基数排序(Radix Sort)
基数排序(Radix Sort)是一种非比较排序算法,它根据数字的每一位(从最低位到最高位)进行排序,具体来说,它是将所有待排序的数字统一为同样的数位长度,然后从最低位开始,依次对每个数位进行排序,最后将所有数字按照数位从低到高的顺序合并成一个有序数组。
95 6
|
机器人 Python
并查集(Union-Find)
并查集(Union-Find)是一种用于解决动态连通性问题的数据结构,它主要用于处理不相交的集合(Disjoint Sets)之间的合并和查询操作。并查集的主要优点是,它不需要比较相邻的元素,而是通过分配和收集元素来进行操作,从而在处理大量数据时非常高效。
80 8
2-路插入排序(Two-Way Insertion Sort)
算法介绍 算法描述 算法分析 代码实现 参考
|
缓存 搜索推荐 算法
图解插入排序——直接插入排序算法(straight insertion sort)
图解插入排序——直接插入排序算法(straight insertion sort)
315 0
图解插入排序——直接插入排序算法(straight insertion sort)