二分查找法(递归与循环实现)
问题:
给定一个排序数组和一个数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;
}
二分查找法(递归与循环实现)相关推荐
- 二分查找法及其四种变形(MATLAB)
已经从学校毕业一年,然而重温一下当年老师布置的各种算法作业,如今才刚刚领悟.因为是数学专业,所以就用MATLAB软件写了一番,也许还存在一些不足,但内心也有一丝的小成绩.今天,就写写二分查找法及其变形 ...
- 二分查找法的递归和非递归实现(C++)
文章目录 1.二分查找法思想 2.算法使用前提 3.递归实现(C++) 4.非递归实现(C++) 1.二分查找法思想 折半查找法也称为二分查找法,它充分利用了元素间的次序关系,采用分治策略,可在最坏的 ...
- 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+ ...
- java二分查找递归_java学习之—递归实现二分查找法
/** * 递归实现二分查找法 * Create by Administrator * 2018/6/21 0021 * 上午 11:25 **/ class OrdArray{ private lo ...
- 冒泡排序,递归二分查找法,二分法
#冒泡排序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 ...
- javascript数据结构与算法---检索算法(二分查找法、计算重复次数)
javascript数据结构与算法---检索算法(二分查找法.计算重复次数) /*只需要查找元素是否存在数组,可以先将数组排序,再使用二分查找法*/ function qSort(arr){if (a ...
- 每日一则----算法----二分查找法
php实现二分查找法 二分查找法称折半查找,需要数组是一个有序的数组 假设我们的数组是一个递增的数组,首先我们需要找到数组的中间位置. 要知道中间位置就需要知道起始位置和结束位置,然后取出中间位置的值 ...
- 算法2(二分查找法)
使用二分查找法的前置条件 必须是一个已经排好序的数组 二分查找定义 从有序列表的候选区data[0:n]开始,通过对待查找的值与候选区中间值的比较,可以使候选区减少一半. 示例图 循环版二分查找法 d ...
- 20210408:力扣(二分查找法的两种写法以及变体题目)
二分查找法的两种写法以及变体题目 写在前面 题目 思路与算法 代码实现 写在最后 写在前面 关于二分查找,真的是一个非常实用的查找算法,主要有两种写法,今天在总结时再次碰到,再次整理,方便后续查看复习 ...
最新文章
- 电脑计算机科学型,电脑里附带的计算器有标准型和科学型二种,它 – 手机爱问...
- 【组队学习】【34期】零基础学python编程思维
- JavaScript函数的调用
- symfony2 环境搭建笔记
- 项目中遇到难题一 : 多条件筛选(同一本小说具有多个特征)
- pmp 成本估算准确高_如何更准确地估算JavaScript中文章的阅读时间
- 邢不行python资源_邢不行—数字货币python量化投资
- Partition分析
- 学NLP不懂这个项目?快别去秋招了,你HOLD不住的!
- php留言系统源码,XYCMS php留言板 v8.0
- javascript编写acm算法题
- 仓库管理系统数据库设计
- android 手势输入法,基于触摸屏的手势输入法
- 【工作感想】 关于前后端分离的问题
- 程序员到CTO的Java技术路线图
- 家务计算机配置,笔记本电脑佳配置是什么样的
- SAP 移动平均价和标准价详细解析
- 基于实践的LabVIEW零基础入门视频教程
- 数据库关系代数练习题
- 显示器的 VGA、HDMI、DVI 和 DisplayPort