PHP二分查找(递归和循环)
二分查找可以通过递归和循环来实现,
思路如下:
将要查找的数和中间数进行比较,
如果相等,则表示找到,返回下标
如果要查找的数小于中间这个数,则说明要查找的数分布在数组左边,修改right边界,使其等于middle-1,直接等于middle,如果查找不到,会造成死归,
如果要查找的数大于中间这个数,则说明要查找的数分布在数组的右边,修改left边界,使其等于middle+1,直接等于middle,如果查找不到,也会造成死归,
递归查找,使用一个静态变量保存下标,
没有查到,则返回-1
代码如下:
//递归二分查找
function binarySearchByRecursion($arr,$val,$left,$right){
static $index = -1;
if($left>$right){
return $index;
}
$middle = floor(($left+$right)/2);
if($val < $arr[$middle]){
//如果$middle不-1,则挑不出去,会一直递归下去
$right = $middle-1;
binarySearchByRecursion($arr,$val,$left,$right);
}elseif($val > $arr[$middle]){
$left = $middle+1;
binarySearchByRecursion($arr,$val,$left,$right);
}else{
$index = $middle;
}
return $index;
}
//循环二分查找
//
function binarySearchByLoop($arr,$val){
$index = -1;
$left = 0;
$right = count($arr)-1;
while($left <= $right ){
$middle = round(($left+$right)/2);
if($val < $arr[$middle]){
$right = $middle - 1;
}elseif($val > $arr[$middle]){
$left = $middle + 1;
}else{
$index = $middle;
break;
}
}
return $index;
}
PHP二分查找(递归和循环)的更多相关文章
- 数据结构&算法(二)_算法基础之前传(递归、时间复杂度、空间复杂度、二分查找)
什么是算法: 间而言之算法(Algorithm):一个计算过程,解决问题的方法 递归的两个特点: 调用自身 结束条件 递归示例: def func(x): : print("我的小鲤鱼&qu ...
- Java实现的二分查找算法
二分查找又称折半查找,它是一种效率较高的查找方法. 折半查找的算法思想是将数列按有序化(递增或递减)排列,查找过程中采用跳跃式方式查找,即先以有序数列的中点位置为比较对象,如果要找的元素值小 于该中点 ...
- 二分查找(binary search)
二分查找又叫折半查找,要查找的前提是检索结果位于已排序的列表中. 概念 在一个已排序的数组seq中,使用二分查找v,假如这个数组的范围是[low...high],我们要的v就在这个范围里.查找的方法是 ...
- 二分查找(binary search)java实现及时间复杂度
概述 在一个已排序的数组seq中,使用二分查找v,假如这个数组的范围是[low...high],我们要的v就在这个范围里.查找的方法是拿low到high的正中间的值,我们假设是m,来跟v相比,如果m& ...
- C#二分查找算法设计实现
C#二分查找算法设计实现 1.介绍 二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法.但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列.(记住了 ...
- 二分查找算法java
二分查找又称折半查找,它是一种效率较高的查找方法. 折半查找的算法思想是将数列按有序化(递增或递减)排列,查找过程中采用跳跃式方式查找,即先以有序数列的中点位置为比较对象,如果要找的元素值小于该中点元 ...
- Leecode之双指针及二分查找
题目 给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数. 函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2. 说明: 返回的 ...
- 二分查找&二叉排序树
首先我们先来复习一下二分查找的算法 对于正向序列的二分查找 递归实现: bool binary_search(vector<int> &sort_arry,int begin,in ...
- 二分查找C++
#include <iostream> using namespace std; //二分查找:每次都从中间位置寻找,如果找到了就返回,如果没找到, //则分两种情况: //(1)中间元素 ...
随机推荐
- uva 11081 - Strings(LCS)
题目链接:11081 - Strings 题目大意:给出三个字符串,从分别从第一个字符串和第二个字符串中挑选子串a,b,用a和b组成第三个字符串,问可组成的子串有多少种. 解题思路:说起来惭愧啊,题目 ...
- 基础总结篇之中的一个:Activity生命周期
子曰:溫故而知新,能够為師矣.<論語> 学习技术也一样,对于技术文档或者经典的技术书籍来说,指望看一遍就全然掌握,那基本不大可能,所以我们须要常常回过头再细致研读几遍,以领悟到作者的思想精 ...
- Android调用系统邮件类应用的正确实现方法
Android应用开发中,很多情况下免不了要调用手机上的邮件类应用,实现邮件发送的功能,这一般是通过调用系统已有的Intent来实现的.看到网上很多邮件发送都是调用action为android.con ...
- asp.net实现将网页内容输出到word并下载到本地
个人觉得要实现这个功能如果没有类库提供的几个关键函数,还是比较繁琐的.所以首先介绍几个将要在代码中使用的关键函数和参数,然后再说函数实现.注意问题等. 关键函数: 1.函数原型:Response.Ap ...
- SQL cmd 实用工具学习 -1
启动 sqlcmd 实用工具并连接到 SQL Server 的默认实例 在"开始"菜单上,单击"运行". 在"打开"框中,键入 cmd,然后 ...
- 去除tableView上面的黑色部分 解决办法
把上面的黑色去掉 只需在 viewDidLoad 中添加代码 self.automaticallyAdjustsScrollViewInsets=NO;就好了... 效果图 如下
- iOS学习笔记-CoreData
简介 CoreData提供了对象关系映射(ORM)功能,从效果上说就是创建了一个"虚拟对象数据库",也可以把它看作一个综合的数据库管理库. NSManagedObjectConte ...
- Jobs定时器 - Quartz
Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用.Quartz可以用来创建简单或为运行十个,百个, ...
- javascript判断键盘按键
window.document.onkeydown = disableRefresh; function disableRefresh(evt){ evt = (evt) ? evt : window ...
- ubuntu终端命令
整个电脑都划成ubuntu用. 装软件时的一个明显感觉就是很多事情,用终端的命令行去做很容易,用图形界面往往很复杂,而且很多时候还会出现权限的问题,对于ubuntu的用户权限,现在的唯一感觉就是权限在 ...