问题:

给定一个排序数组和一个数k,要求找到第一个k的位置和最后一个k的位置

解析:

由于给定的数组是从小到大排序的,故可以按照二分查找法来找,下面分别从递归和循环两种方法来阐述:

//递归方法
int GetFirstK(int* data, int length, int k, int start, int end)
{if (start > end)return -1;int middleindex = (start + end) / 2;int middledata = data[middleindex];if (middledata>k){end = middleindex - 1;}else if (middledata<k){start = middleindex + 1;}else{if (middleindex==0||(middleindex>0&&data[middleindex-1]!=k))//判断左边的元素是否等于k,若等于,说明第一个k在左边,否则第一个k就是middledata{return middleindex;}else{end = middleindex - 1;}}return  GetFirstK(data, length, k,start, end);
}
//循环法
int GetFirstK(int* data, int length, int k)
{int start = 0;int end = length - 1;while (start<=end){int middleindex = (start + end) / 2;int middledata = data[middleindex];if (middledata<k){start = middleindex + 1;}else if (middleindex>k){end = middleindex - 1;}else{if (middleindex==0||(middleindex>0&&data[middleindex-1]!=k)){return middleindex;}else{end = middleindex - 1;}}}return -1;}
//递归法
int GetLastK(int* data, int length, int k, int start, int end)
{if (start>end){return -1;}int middleindex = (start + end) >> 1;int middledata = data[middleindex];if (middledata<k){start = middleindex + 1;}else if (middledata>k){end = middleindex - 1;}else{if (middleindex==length-1||(middleindex<length-1&&data[middleindex+1]!=k)){return middleindex;}else{start = middleindex + 1;}}return GetLastK(data, length, k, start, end);
}
//循环法
int GetLastK(int* data, int length, int k)
{int start = 0;int end = length - 1;while (start<=end){int middleindex = (start + end) >> 1;int middledata = data[middleindex];if (middledata>k){end = middleindex - 1;}else if (middledata<k){start = middleindex + 1;}else{if (middleindex==length-1||(middleindex<length-1&&data[middleindex+1]!=k)){return middleindex;}else{start = middleindex + 1;}}}return -1;
}

二分查找法(递归与循环实现)相关推荐

  1. 二分查找法及其四种变形(MATLAB)

    已经从学校毕业一年,然而重温一下当年老师布置的各种算法作业,如今才刚刚领悟.因为是数学专业,所以就用MATLAB软件写了一番,也许还存在一些不足,但内心也有一丝的小成绩.今天,就写写二分查找法及其变形 ...

  2. 二分查找法的递归和非递归实现(C++)

    文章目录 1.二分查找法思想 2.算法使用前提 3.递归实现(C++) 4.非递归实现(C++) 1.二分查找法思想 折半查找法也称为二分查找法,它充分利用了元素间的次序关系,采用分治策略,可在最坏的 ...

  3. java for循环和数组--冒泡排序、二分查找法

    //100以内与7相关的数 for(int a=1;a<=100;a++){     if(a%7==0||a%10==7||a/10==7){      System.out.print(a+ ...

  4. java二分查找递归_java学习之—递归实现二分查找法

    /** * 递归实现二分查找法 * Create by Administrator * 2018/6/21 0021 * 上午 11:25 **/ class OrdArray{ private lo ...

  5. 冒泡排序,递归二分查找法,二分法

    #冒泡排序list1=[2,4,5,6,7,8,9,11,30,35,38,41,42] def bubble_sort(list):for i in range(len(list)-1):for j ...

  6. javascript数据结构与算法---检索算法(二分查找法、计算重复次数)

    javascript数据结构与算法---检索算法(二分查找法.计算重复次数) /*只需要查找元素是否存在数组,可以先将数组排序,再使用二分查找法*/ function qSort(arr){if (a ...

  7. 每日一则----算法----二分查找法

    php实现二分查找法 二分查找法称折半查找,需要数组是一个有序的数组 假设我们的数组是一个递增的数组,首先我们需要找到数组的中间位置. 要知道中间位置就需要知道起始位置和结束位置,然后取出中间位置的值 ...

  8. 算法2(二分查找法)

    使用二分查找法的前置条件 必须是一个已经排好序的数组 二分查找定义 从有序列表的候选区data[0:n]开始,通过对待查找的值与候选区中间值的比较,可以使候选区减少一半. 示例图 循环版二分查找法 d ...

  9. 20210408:力扣(二分查找法的两种写法以及变体题目)

    二分查找法的两种写法以及变体题目 写在前面 题目 思路与算法 代码实现 写在最后 写在前面 关于二分查找,真的是一个非常实用的查找算法,主要有两种写法,今天在总结时再次碰到,再次整理,方便后续查看复习 ...

最新文章

  1. 电脑计算机科学型,电脑里附带的计算器有标准型和科学型二种,它 – 手机爱问...
  2. 【组队学习】【34期】零基础学python编程思维
  3. JavaScript函数的调用
  4. symfony2 环境搭建笔记
  5. 项目中遇到难题一 : 多条件筛选(同一本小说具有多个特征)
  6. pmp 成本估算准确高_如何更准确地估算JavaScript中文章的阅读时间
  7. 邢不行python资源_邢不行—数字货币python量化投资
  8. Partition分析
  9. 学NLP不懂这个项目?快别去秋招了,你HOLD不住的!
  10. php留言系统源码,XYCMS php留言板 v8.0
  11. javascript编写acm算法题
  12. 仓库管理系统数据库设计
  13. android 手势输入法,基于触摸屏的手势输入法
  14. 【工作感想】 关于前后端分离的问题
  15. 程序员到CTO的Java技术路线图
  16. 家务计算机配置,笔记本电脑佳配置是什么样的
  17. SAP 移动平均价和标准价详细解析
  18. 基于实践的LabVIEW零基础入门视频教程
  19. 数据库关系代数练习题
  20. 显示器的 VGA、HDMI、DVI 和 DisplayPort

热门文章

  1. Angular自学笔记(?)TemplateRef和ViewContainerRef
  2. Codechef Yet another cute girl
  3. 【leetcode❤python】 9. Palindrome Number
  4. DataTable是否存在某个列的判断
  5. flash在影片剪辑里面跳转场景
  6. oAuth2.0 登录新浪微博 发送新浪微博 代码
  7. ‘仿微信发表朋友圈’项目中登录功能的业务逻辑
  8. 大前端完整学习路线(完整版),路线完整版
  9. bcrypt的简单使用
  10. Laravel核心解读--控制器