首页 > 其他分享 >二分查找

二分查找

时间:2023-02-17 15:01:40浏览次数:33  
标签:二分 right int mid 查找 left


     二分查找又叫折半查找 , 指的是每次查找的范围减半, 与枚举算法相比 ,二分查找具有比较次数少,查找速度快 , 平均性能好等优点,缺点是要求待查找的数据已被整理为有序列表 .

     二分查找的目标是对于有序列表 , 在其中查找指定的目标元素的位置 , 其基本思想是 : 在有序数列中 , 将列表中得中间位置元素与目标元素作比较 , 如果两者相等 ,则查找成功 ,否则将列表从中间位置分离开 , 分成前,后两个子列表 如果中间位置的元素大于目标元素,则进一步查找前一子列表, 否则进一步查找后一子列表 , 当然前提是 , 列表是从小到大排序的 ,重复以上步骤 ,直到查找到满足元素,

比如  有序列表 L = [ 1,4,8,9,12,63,79 ]

查找8

第一步 : 比较L中间的 9 和 目标元素 8 ,  9>8 ,再查找 [ 1,4,8 ]

第二部 : 比较 L 中间的 4 和 目标元素 8 , 4<8  ,再查找  [8 ]

第三部 : 找到 

#include <iostream>
#include <cstdio>
using namespace std ;
int Binary_Search(int L[], int key , int left ,int right )
{
int mid ;
while ( right >=left )
{
mid = left + (right -left)/2 ;
if(L[mid] == key)
{
return mid ;
}
else if (L[mid] <key)
{
left = mid + 1 ;

}
else
{
right = mid - 1 ;
}
}

}
int main()
{
int a[10] = {1, 4,8,9,12,63,79};
cout<<Binary_Search(a,79,0,8);

return 0 ;
}

可见二分查找算法的基本思想十分直观 , 易于理解 ,而且二分查找充分利用了元素的次序关系 ,采用分治策略,可在最坏的情况下用O(logN)完成查找任务 .

需要注意

(1) 数据范围.

         整形的范围是 -2^31 ~ 2^31-1 , 二分查找在求中间位置时 ,如果使用 int mid = (left + right ) /2 的形式 ,则 对于较大的 left 和 right ,有可能相加后超过整形的表示范围 , 得到错误的计算结果 , 因此应使用 int mid = left + (right - left ) /2 的形式 

(2) 边界确定

        边界确定涉及到二分查找的判断和赋值 ,如 right >left 还是 right >= left  ,right = mid -1  还是 right =mid ,甚至包括 right 的初始值是n 还是  n-1 .  边界必须要遵循一定的区间规则, 序列及其子序列的mid 和 right 都要表示统一的开闭区间 , 也就是说当 right = n 的时候 ,是左闭右开 的区间 [left, right) ,那么在取子序列的时候 , 仍然要保持左闭右开 .

 

    

 

 

标签:二分,right,int,mid,查找,left
From: https://blog.51cto.com/u_15970235/6064119

相关文章

  • 二分查找水题--疯牛(POJ 2456)
    DescriptionFarmerJohnhasbuiltanewlongbarn,withN(2<=N<=100,000)stalls.Thestallsarelocatedalongastraightlineatpositionsx1,...,xN(0<=x......
  • 牛客小白月赛12 -- E 华华给月月准备礼物 (二分)
     题目描述二月中旬虐狗节前夕,华华决定给月月准备一份礼物。为了搭建礼物的底座,华华需要若干根同样长的木棍。华华手头上有一些长度参差不齐的木棍,他想将每根都裁剪成若干......
  • 查找数组中元素
    任务:输入一个固定长度的数组,并输入一个要查找的数,给出能不能检索到的伪代码并测试   伪代码:Begin输入list[6]<-{60,75,95,80,65,90}i<-1ReadnumbermWhilei<=6......
  • 二分模板
    例题:AcWing789.数的范围原题:使用二分查找数值\(x\)的范围\([l,r)\)。注意:采用左闭右开的方式,这个时候返回右端点时会比最大编号多一,输出时要\(-1\)。而求最小编......
  • D. Moving Dots(组合数学,贡献,二分/双指针)
    题目https://codeforces.com/contest/1788/problem/D思路从题目给的“2”这个信息入手,从贡献这个方面来考虑对于任意两不同的点,具有一定的范围,让这个范围内的点都被......
  • 2.二分查找新方法
    2.二分查找目录2.二分查找2.1新方法2.2例子162.寻找峰值2.1新方法近日重写二分查找的算法题还是倍感疑惑,在边界问题上还是有问题。在B站学习的时候,学到了一种新的理......
  • 根据Query的名字查找是那个CLF逻辑中使用
    selectcdodefinition.cdoname,CLFeventMap.Name"Method",CLFDefinition.CLFNAMECLF--,CLFSource.CLFNAMECLFCopySource,functiondefinition.NAMEFunctionName,fu......
  • Windows命令findstr文本文件中查找字符串(findstr-对应于Linux中的grep命令)
    一、实例如查找coco.names文件中的car所在的行:findstr/N/A:02carcoco.names或将全部内容(用点.代替)转出到文本文件:findstr/N/A:02.coco.names>coco.txt二、知识点......
  • DS-单链表:查找元素值为x的结点的前驱结点
    一、定义单链表结构代码:typedefintlinkType; ///<定义链表结点数据域数据类型///@brief链表结点定义typedefstructt_linkNode{structt_lin......
  • DS-单链表:查找单链表中第一个元素值为x的结点
    一、定义单链表结构代码:typedefintlinkType; ///<定义链表结点数据域数据类型///@brief链表结点定义typedefstructt_linkNode{structt_lin......