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. linux 代码格式化工具 clang-format
  2. Angular 下的 directive (part 2)
  3. 数据结构-简单选择排序(C语言)
  4. ubuntu mysql 5.7_Ubuntu 18.04 安装mysql5.7
  5. 用Win8刷新和系统重置轻松恢复系统
  6. XCTF-MISC-新手区-base64stego
  7. java 继承变量_用java中的变量继承
  8. 在外企和大厂都实习过是一种什么体验?
  9. 云小课 | 守护网络安全不是问题,iptables的四表五链为你开启“八卦阵”
  10. 《A Sub-Pixel Edge Detector: an Implementation of the Canny/Devernay Algorithm》
  11. sdr 软件_SDR软件定义无线电是什么?不仅仅是大频谱
  12. 天涯明月刀手游为什么服务器维护,天涯明月刀手游12.7日更新公告 更新内容详情一览...
  13. http协议及基于http协议的文件下载
  14. Android开发环境的搭建教程
  15. 渗透测试必备前置知识
  16. 4.证券投资基金的监管
  17. doodoo.js配置教程
  18. 计算机视觉算法实习生:大厂面试经历(百度、京东、滴滴、字节、美团,旷视,快手,小米)
  19. 移远EC25-xxx国外支持列表
  20. 用于清理系统垃圾的batch文件

热门文章

  1. 我对JS栈的简单学习
  2. 我的家庭私有云计划-20
  3. 一个令周润发感动流泪的故事《树》
  4. 微软在华推广Win7拒绝“黑屏”
  5. web项目无法热更新
  6. 5.性能之巅 洞悉系统、企业与云计算 --- 应用程序
  7. 2.深入分布式缓存:从原理到实践 --- 分布式系统理论
  8. 7.Shell 编程从入门到精通 --- 流编辑
  9. 20.UNIX 环境高级编程--数据库函数库
  10. 2.tcpdump(1)