二分查找

1.二分查找

二分法查找,也称为折半法,是一种在有序数组中查找特定元素的搜索算法。他的时间复杂度为O(logN)

2.在一组没有重复值的升序数组中查找所求数

//代码及其运行截图
int Binarysearch(int* str,int strlen, int target){int left = 0;int right = strlen - 1;while (left <= right){//如果只是left<right,则会少一次比较int mid = left+((right-left)>>1);//(left+right)/2容易溢出if (*(str + mid) < target){//要找的数在中点的右边left = mid+1;}else if (*(str + mid) > target){//要找的数在中点的左边right = mid-1;}else{return mid;break;}}return -1;
}int main(){int str[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 23, 45 };int size = sizeof(str) / sizeof(str[0]);int x = Binarysearch(str, size, 11);cout << x << endl;
}

这段代码,在没有重复值的升序数组中,运行结果会准确输出,如下运行结果:
!

但是,如果升序数组arr[]={1,2,3,4,4,4,5,5,6,7,8}则输出的结果不会准确,此时我们需要的是出现所找的数的第一个下标或者最后一个下标。

3.在一组有重复值的升序数组中查找所求数

首先我们可以想到,通过二分法拿到一个值,然后再通过这个值向左或向右进行遍历查询,但是此时的时间复杂度为O(logN),因此,我们可以继续通过二分查找法,查找最左或者最右目标值。
查找最左目标值:

//在一组有重复值的升序数组里
int search(int* str,int strlen, int target){int left = 0;int right = strlen - 1;while (left <= right){int mid = left+((right-left)>>1);if (*(str + mid) >= target)  //此时,假设当mid下标所指的值等于我们所查找的值,先不进行返回,此时最高位指向mid且左移一位right = mid - 1;elseleft = mid + 1;if (*(str + right)<target)  //此时进行上一个条件中right下标所存的数据与我们target值的比较,如果此时此时的值是小于target,那么mid下标所存的数据则为所求数的最左值,进行输出,否则继续循环return mid;elsecontinue;}return -1;
}

此时我们所求的最左值为3
查找最右目标值:

//在一组有重复值的升序数组里
//查找最右目标值与查找最左目标值的思路相似
int search(int* str,int strlen, int target){int left = 0;int right = strlen - 1;while (left <= right){int mid = left+((right-left)>>1);if (*(str + mid) <= target)  left = mid + 1;elseright=mid-1;if (*(str + right)>target) return mid;elsecontinue;}return -1;
}

最终代码及结果:

#include<iostream>
using namespace std;
//二分查找,有重复值的二分查找//在一组有重复值的升序数组里
int right_search(int* str, int strlen, int target){int left = 0;int right = strlen - 1;while (left <= right){int mid = left + ((right - left) >> 1);if (*(str + mid) <= target)left = mid + 1;elseright = mid - 1;if (*(str + right) == target )return right;elsecontinue;}if (left > right)return -1;
}//在一组有重复值的升序数组里
int left_search(int* str, int strlen, int target){int left = 0;int right = strlen - 1;while (left <= right){int mid = left + ((right - left) >> 1);if (*(str + mid) >= target)  //此时,假设当mid下标所指的值等于我们所查找的值,先不进行返回,此时最高位指向mid且左移一位right = mid - 1;elseleft = mid + 1;if (*(str + left) == target)  //此时进行上一个条件中right下标所存的数据与我们target值的比较,如果此时此时的值是小于target,那么mid下标所存的数据则为所求数的最左值,进行输出,否则继续循环return left;elsecontinue;}if (left > right)return -1;
}int main(){int str[] = { 1, 2, 3, 4, 4, 4, 4, 4, 5, 5, 6, 7, 8, 9, 10 };int size = sizeof(str) / sizeof(str[0]);cout << "找打5的位置:" << endl;int right_x5 = right_search(str, size, 5);int left_x5 = left_search(str, size, 5);if (left_x5 == right_x5)cout << "可知所求数在此数组里只有一个,且下标为" << right_x5 << endl;else{cout << "他的最左下标值为:" << left_x5 << endl;cout << "他的最右下标值为:" << right_x5 << endl;}cout << "找打2的位置:" << endl;int right_x2 = right_search(str, size, 2);int left_x2 = left_search(str, size, 2);if (left_x2 == right_x2)cout << "可知所求数在此数组里只有一个,且下标为" << right_x2 << endl;else{cout << "他的最左下标值为:" << left_x2 << endl;cout << "他的最右下标值为:" << right_x2 << endl;}
}

运行截图:

以上都是我个人所思所得,如果有错误,欢迎在评论区指正。

二分查找及有重复值的查找相关推荐

  1. 怎么在EXCEL里查找是否有重复值,福利在这里,EXCEL里如何查找是否存在重复值

    在录入EXCEL表格时,如果数据过多,会出现重复录入的数据,也就是重复值.如何查看EXCEL表格里是否存在重复值以及把这些重复值查找出来呢?今天小编教给大家一个小技巧: 第一步.新建一个EXCEL 第 ...

  2. excel查找定位删除0值_查找和删除Excel行的快速方法

    excel查找定位删除0值 It's finally summer, and you need to stay cool, even when you're using Excel. Here's a ...

  3. hashmap的键查找遍历与键值对查找遍历

    键找值方式:即通过元素中的键,获取键所对应的值 操作步骤: 1.获取Map集合中所有的键,由于键是唯一的,所以返回一个Set集合存储所有的键 2.遍历键的Set集合,得到每一个键 3.根据键,获取键所 ...

  4. oracle查找clob中的值,Oracle 查找带有CLOB字段的所有表

    myBatis的一对多查询,主要利用resultMap实现一次查询多个结果集 日常开发中有这中场景,一个用户有多个角色,一个角色又有多个菜单,想查出一个用户的所有菜单.除了常见的关联查询之外,更使用的 ...

  5. datacombo重复值的处理_Pandas入门【S1E3】缺失值和重复值处理

    导语: 前两期分别就pandas安装和导入数据.pandas数据探索做了梳理. 回顾如下: Pandas安装和数据导入​mp.weixin.qq.com Pandas数据探索​mp.weixin.qq ...

  6. Java有序表查找:折半查找、二分查找、差值查找和斐波那契查找

    Java有序表查找:折半查找.二分查找.差值查找和斐波那契查找     [尊重原创,转载请注明出处]http://blog.csdn.net/guyuealian/article/details/51 ...

  7. 有序数组二分查找最接近的值

    有序数组二分查找最接近的值 问题 思路 代码 循环的终止条件 如何改为求upper_bound 问题 给你一个有序数组,数组里面有正有负,有重复值,再给你扔一个target 数,求这个数组中最接近ta ...

  8. elasticsearch 根据条件去除重复值_Excel工作表中的条件格式,不只是查找重复值,还有7种典型用法...

    Excel工作表中的[条件格式],对于大部分亲来说并不陌生,用的最多的应该是标识"重复值"或"唯一值",其实还有数据可视化等多种功能-- 一.Excel条件格式 ...

  9. 1.11 编程基础之二分查找 08 不重复地输出数 python

    http://noi.openjudge.cn/ch0111/08/ """ 1.11 编程基础之二分查找 08 不重复地输出数 http://noi.openjudge ...

最新文章

  1. R可视化多元线性回归模型
  2. Angular的built-in指令
  3. monolith_将Java EE Monolith雕刻成微服务
  4. Java基本数据类型总结(转)
  5. Broadcast receiver之我见
  6. C++ 鼠标乱动整人代码
  7. Lifo管理系统(转载)
  8. 转载C# -- 系统托盘NotifyIcon控件
  9. 计算机限制360打不开,电脑360浏览器打不开解决方法
  10. 【软件测试】学习路线资料整理摆脱迷茫,突破瓶颈(送给我迷茫的朋友)
  11. 安卓跳转应用市场评论
  12. 阿尔茨海默最新研究进展(2022年12月)
  13. 浅谈雷达在气象领域的基本应用
  14. PicGo+Typora图床搭建教程
  15. 第三个Sprint ------第十一天
  16. 迪文串口屏使用注意事项
  17. 如何优雅的抄袭代码?天下代码一大抄,这才是正确的姿势
  18. 浙大高分子物理郑强教授
  19. 【Demo见真章】基于HarmonyOS手机实现五子棋对战小游戏
  20. [C++实现 设计模式(6)] : 代理模式

热门文章

  1. 7-6 寻找大富翁 (25分)
  2. Spring idea中spring配置文件自动检查配置应用程序上下文的操作
  3. Day118.尚医通:订单列表、详情、微信支付、查询交易状态
  4. 淘宝,天猫获得商品评论 API
  5. python中画出距平垂线_3.机器学习—数据科学包3.3pandas操作
  6. [深度学习]实现一个博弈型的AI,从五子棋开始
  7. ShadowDiffusion: When Degradation Prior Meets Diffusion Model for Shadow Removal (Paper reading)
  8. 小米7.0系统如何无Root激活Xposed框架的教程
  9. 某程序员哀叹:辛辛苦苦写几年代码,做了些业务,有了点成就感,但回头一看80%都没用,没法写到简历上!...
  10. 【anyRTC-RTMP-OpenSource】2.0 windows构建