1 查找第一个等于目标值的元素
2 查找最后一个等于目标值的元素
3 查找第一个大于等于目标值的元素
4 查找最后一个小于等于目标值的元素

代码实现:

int search1(int* pData, int size, int destData) // 查找第一个等于目标值的元素
{if (nullptr == pData || size <= 0) return -1;int begin = 0;int end = size - 1;while (begin <= end) // 注意等于{int middle = begin + ((end - begin) >> 1); // 不使用middle = (begin + end) / 2, 存在溢出可能if (destData == pData[middle]){if (0 == middle || pData[middle - 1] != destData) return middle; // 已经是第一个数据,或者前一个数据不等于目标值else end = middle - 1; // 在左区间[begin , middle - 1]继续查找}else if (destData < pData[middle]) end = middle - 1;// 在左区间[begin , middle - 1]继续查找else begin = middle + 1; // 在右半区间[middle + 1, end]继续查找}return -1;
}
int search2(int* pData, int size, int destData) // 查找最后一个等于目标值的元素
{if (nullptr == pData || size <= 0) return -1;int begin = 0;int end = size - 1;while (begin <= end) // 注意等于{int middle = begin + ((end - begin) >> 1); // 不使用middle = (begin + end) / 2, 存在溢出可能if (destData == pData[middle]){if (middle == end || pData[middle + 1] != destData) return middle; // 已经是最后一个数据,或者后一个数据不等于目标值else begin = middle + 1; // 在右半区间[middle + 1, end]继续查找}else if (destData < pData[middle]) end = middle - 1;// 在左半区间[begin , middle - 1]继续查找else begin = middle + 1; // 在右半区间[middle + 1, end]继续查找}return -1;
}
int search3(int* pData, int size, int destData) // 查找第一个大于等于目标值的元素
{if (nullptr == pData || size <= 0) return -1;int begin = 0;int end = size - 1;while (begin <= end) // 注意等于{int middle = begin + ((end - begin) >> 1); // 不使用middle = (begin + end) / 2, 存在溢出可能if (pData[middle] >= destData){if (0 == middle || pData[middle - 1] < destData) return middle; // 已经是第一个数据,或者前一个数据小于目标值else end = middle - 1; // 在左半区间[begin , middle - 1]继续查找}else begin = middle + 1; // 在右半区间[middle + 1, end]继续查找}return -1;
}

int search4(int* pData, int size, int destData) // 查找最后一个小于等于目标值的元素
{if (nullptr == pData || size <= 0) return -1;int begin = 0;int end = size - 1;while (begin <= end) // 注意等于{int middle = begin + ((end - begin) >> 1); // 不使用middle = (begin + end) / 2, 存在溢出可能if (pData[middle] <= destData){if (middle == end || pData[middle + 1] > destData) return middle; // 已经是最后一个数据,或者后一个数据大于目标值else begin = middle + 1; // 在右半区间[middle + 1 , end]继续查找}else end = middle - 1; // 在左半区间[begin, middle - 1]继续查找}return -1;
}

查找算法之变种二分查找(C++版本)相关推荐

  1. 数据结构 | 折半查找 /二分查找 算法细节、二分查找判定树

    一.基本思想 假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功:否则利用中间位置记录将表分成前.后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步 ...

  2. python 二分查找算法_Python实现二分查找法

    用Python来实现二分查找 1.问题需求 输入列表[1,4,4,5,7,7,8,9,9,10]和目标整数1,输出其所在的位置为0,即第1次出现在第0个位置.输入列表[1,2,3,3,4,5,10]和 ...

  3. 查找算法之一:二分查找(递归实现)

    二分查找的递归实现 思路分析 代码实现 思路分析 1.确定该序列的中间的下标mid: mid = (left + right)/2: 2.让需要查找的数findVal 与 arr[mid]进行比较: ...

  4. python实现二分查找算法_python实现二分查找算法

    ??二分算法的定义不在多说了,百度一下就知道(支持国产 ) import syssource = [1,2,3,4,5,6,7,8,9,10] #must be in orderdes = int(s ...

  5. 二分查找算法及其变种

    前言 二分查找算法也称为折半查找算法,是一种在查找算法中普遍使用的算法.其算法的基本思想是:在有序表中,取中间的记录作为比较关键字,若给定值与中间记录的关键字相等,则查找成功:若给定的值小于中间记录的 ...

  6. python二分法查找算法_顺序查找算法和折半(二分法)查找算法,C语言查找算法详解...

    查找是指在大量的信息中寻找一个特定的信息.在计算机中,查找是非常重要的一个应用,比如"百度".查找算法的好坏直接影响查找的速度. 常用的查找算法主要有顺序查找和折半(二分法)查找: ...

  7. 数据结构之查找算法:散列查找

    查找算法:散列查找 思维导图: 散列函数和散列表: 构造散列函数的要求: 构造散列函数的方法: 直接定址法: 除留取余法: 数字分析法: 平方取中法: 折叠法: 解决冲突的方法: 开放定址法: 线性探 ...

  8. c语言二分法查找一个数_算法简解-二分查找

    读书不记录=没读,始终是我的信条·····最近因为要参加竞赛,发现自己真的差的很远,所以打算重新开始学习一遍算法及AI的相关数学知识,相信很多人都是闻数学,理工科色变,之前也是觉得上数理课太难了,真的 ...

  9. 算法前戏 递归 二分查找 列表查找

    一.递归 概念: 函数直接或者间接的调用自身算法的过程,则该函数称为递归函数.在计算机编写程序中,递归算法对解决一大类问题是十分有效的. 特点: ①递归就是在过程或者函数里调用自身. ②在使用递归策略 ...

  10. java 二分搜索获得大于目标数的第一位_程序员数据结构算法编程,二分查找搜索算法的原理与应用介绍!...

    本文来讲一种搜索算法,即二分搜索算法,通常在面试时也会被问到. 我们先来看一个例子,在图书馆通常是根据查到的编号去找书,可以在书架上按顺序一本本地查找,也可以找到一本书不符合预期时,再跳过一大部分书再 ...

最新文章

  1. 基于机器学习的web异常检测(转)
  2. cmd中的进度如何捕捉到输出内容_python 中日志异步发送到远程服务器
  3. android的交互方式,Android与js的交互方式
  4. 创建Docker私有仓库
  5. 用qt编写的解析tiff文件的类
  6. c语言实习报告,计算机c语言编程实习心得
  7. 视频如何分解成图片?怎么提取视频中的图片?
  8. Winform UI界面设计例程——侧边框栏折叠
  9. c语言提取质心坐标,求图像质心的C语言实现
  10. mysql密码过期批处理_批处理脚本一键重置mysql的root密码
  11. qr码生成_在PHP中生成QR码
  12. 在tensorflow下进行pip操作时需要注意的地方
  13. Karabiner Elements for Mac(键盘改键神器)
  14. 单位篮球比赛结束,感想很多
  15. android硬件加速默认,android 硬件加速
  16. adb 命令输入字符串
  17. html 右键菜单 插件,Script Menu:自定义右键菜单
  18. AD20铺铜操作及设置
  19. 教师管理助手平台有哪些功能特别好,使其非常受学生们喜欢
  20. pyinstaller打包——将多个py文件+图片打包(最细教程)

热门文章

  1. 【探索PowerShell 】【七】变量
  2. 解决Mac下Parallels Desktop的Host-only网络问题
  3. 5.2刚买了佳能的ixus100is数码相机,可以录像不过是mov格式的,需要转换为dvd的软件...
  4. C#中的#define DEBUG疑问
  5. 解决Eclipse建Maven项目module无法转换为2.5
  6. 7.企业安全建设入门(基于开源软件打造企业网络安全) --- 蜜罐与攻击欺骗
  7. 第006讲 多媒体页面 标签汇总
  8. 3. XML 树结构
  9. 国产APP自动化测试工具AndroidRobot下载地址
  10. 虚拟机和主机之间建立虚拟磁盘