使用PHP实现二分查找算法代码分享
2015-01-24信息快讯网
二分查找又称折半查找,它是一种效率较高的查找方法。
第一种方法:
【二分查找要求】:1.必须采用顺序存储结构 2.必须按关键字大小有序排列。
【优缺点】折半查找法的优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。
【算法思想】首先,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。
<?php //作者:遥远的期待 //QQ:15624575 //主页:http://www.phptogether.com/ //正向排序的数组 $arr=array(1,3,5,7,9,11); //逆向排序的数组 $arr2=array(11,9,7,5,3,1); //对正向排序的数组进行二分查找 function searchpart($arr,$x){ $start=0; $end=count($arr)-1; while($start<=$end){ $mid=intval(($start+$end)/2);//这里只需要保证中间项下标的计算值为整数即可,也可以四舍五入,不影响结果 if($arr[$mid]>$x){//如果中间项的值大于待查值,说明代差值位于中间项的左边,因此,起始下标不变,结束下标变成中间项下标减1,第一次搜索的是$arr[0]-$arr[5]的话,下一次搜索 $end=$mid-1;//$arr[0]-$arr[1] }elseif($arr[$mid]<$x){//如果中间项的值小于待查值,说明代差值位于中间项的右边,因此,结束下标不变,起始下标变成中间项下标加1,第一次搜索的是$arr[0]-$arr[5]的话,下一//次搜索是,$arr[3]-$arr[5] $start=$mid+1; }else{//找到了,返回待查值下标 return $mid; } } } //对逆向排序的数组进行二分查找 function searchpart2($arr,$x){ $start=0; $end=count($arr)-1; while($start<=$end){ $mid=intval(($start+$end)/2);//这里只需要保证中间项下标的计算值为整数即可,也可以四舍五入,不影响结果 if($arr[$mid]>$x){//如果中间项的值大于待查值,说明代差值位于中间项的右边,因此,结束下标不变,起始下标变成中间项下标加1,第一次搜索的是$arr[0]-$arr[5]的话,下一次搜索 $start=$mid+1;//$arr[3]-$arr[5] }elseif($arr[$mid]<$x){//如果中间项的值小于待查值,说明代差值位于中间项的左边,因此,起始下标不变,结束下标变成中间项下标减1,第一次搜索的是$arr[0]-$arr[5]的话,下一//次搜索是,$arr[0]-$arr[1] $end=$mid-1; }else{//找到了,返回待查值下标 return $mid; } } } echo searchpart2($arr,5).'<br>'; echo searchpart2($arr2,5); ?>
PHP的二分查找算法实现
最近整理了下以前学习的算法知识,虽然在WEB开发时算法用到的情况比较少,但还是把一些有用的算法做下备份。
折半查找法也称为二分查找法,它充分利用了元素间的次序关系,采用分治策略,可在最坏的情况下用O(log n)完成搜索任务。
【基本思想】
将n个元素分成个数大致相同的两半,取a[n/2]与欲查找的x作比较,如果x=a[n/2]则找到x,算法终止。如果x<a[n/2],则我们只要在数组a的左半部继续搜索x(这里假设数组元素呈升序排列)。如果x>a[n/2],则我们只要在数组a的右半部继续搜索x。
二分搜索法的应用极其广泛,而且它的思想易于理解。第一个二分搜索算法早在1946 年就出现了,但是第一个完全正确的二分搜索算法直到1962年才出现。Bentley在他的著作《Writing Correct Programs》中写道,90%的计算机专家不能在2小时内写出完全正确的二分搜索算法。问题的关键在于准确地制定各次查找范围的边界以及终止条件的确定,正确地归纳奇偶数的各种情况,其实整理后可以发现它的具体算法是很直观的。
PHP的二分查找算法实现
/** * 二分查找算法 * * @param array $arr 有序数组 * @param int $val 查找的数值 * @return int 查找值存在返回数组下标,不存在返回-1 */ function binary_search($arr,$val) { $l = count($arr);//获得有序数组长度 $low = 0; $high = $l -1; while($low <= $high) { $middle = floor(($low + $high) / 2); if($arr[$middle] == $val) { return $middle; } elseif($arr[$middle] > $val) { $high = $middle - 1; } else { $low = $middle + 1; } } return -1; } //示例 $arr = array(1,2,3,4,5,6,7,8,9,12,23,33,35,56,67,89,99); echo binary_search($arr,57);
PHP 冒泡排序 二分查找 顺序查找 二维数组排序算法函数的详解
PHPMailer使用教程(PHPMailer发送邮件实例分析)
php单例模式实现(对象只被创建一次)
利用php实现禁用IE和火狐的缓存问题
php自动给文章加关键词链接的函数代码
PHP文章按日期(月日)SQL归档语句
php排序算法(冒泡排序,快速排序)
php全排列递归算法代码
查找mysql字段中固定字符串并替换的几个方法
微博短链接算法php版本实现代码
php 操作数组(合并,拆分,追加,查找,删除等)
php数据结构与算法(PHP描述) 查找与二分法查找
通过PHP的内置函数,通过DES算法对数据加密和解密
PHP 查找字符串常用函数介绍
超小PHP小马小结(方便查找后门的朋友)
php session安全问题分析
PHP求最大子序列和的算法实现
php中转义mysql语句的实现代码
php中对2个数组相加的函数
php判断输入不超过mysql的varchar字段的长度范围
PHP array操作10个小技巧分享
php小技巧 把数组的键和值交换形成了新的数组,查找值取得键
php 大数据量及海量数据处理算法总结
PHP学习之字符串比较和查找
微盾PHP脚本加密专家php解密算法
PHP 冒泡排序算法的实现代码
PHP stristr() 函数(不区分大小写的字符串查找)
php strstr查找字符串中是否包含某些字符的查找函数
PHP 加密解密内部算法
php 数组二分法查找函数代码