PHP排序算法
1.PHP二分查找法
当我尝试用初学的PHP写二分查找法时,我想不管什么算法首先应该有个思路,理解算法代码背后的数学逻辑,可以借助草稿纸,图像等等可以利用的方式,此处我利用的是图像,如下所示
分析该思路图,我通过不断的取原数组的子集,取的判断标准为比较我要找的值和原数组中间值的大小关系,通过控制元素下标不断像要找的值可能出现的区域逼近,首先初步考虑变量个数和类型:$start(数组开始下标),$end(数组结束下标),$mid(数组中间值坐标),$len(数组长度)
接着开始起草代码,代码如下
<?php function besearch($arr,$start,$len,$find) //传进参数有数组,数组开始位置,数组长度,要找的值.这些值是为了计算重要坐标数值,用来进行比较 { $end = $start+$len-1; //求数组最后一个元素的下标,就是用开始位置加上长度+1即可,因为数组从0开始,长度从1开始, $mid = floor($start+$len/2); //求数组中间元素的下标,floor函数可以取整,不过是像下取整,2.8取2,起始位置加上长度除以2取整既中间位置下标 if($arr[$start]>$find or $arr[$end]<$find) //判断边界数值,如果要找的值小于最小的,或者大于最大的,则判断没有这个值。因为是为了体现二分查找法,默认数组已经排序好了 { return "查无此人"; } elseif ($find==$arr[$mid]) //二分法中间值和要找的值相等时,一旦恰巧中间值等于要找的值,或者数组不断缩减到只剩一个值而且相等时,则表示查到了。 { return "ok!"; } elseif($find<$arr[$mid]) //小于中间值,递归,求长度是$mid-$start,初始值不变、如果要找的值小于中间值,则重新计算数组的开始位置,长度,和中间值,有了这几个关键值,剩下的步骤都是重复的,所以使用了递归算法,数组依然是$arr不变。起始位置因为是舍弃mid右边的,也不会变化。长度挥发上变化,通过末位置也就是mid的值减去起始位置即可得到。find要找的值不变 { return besearch($arr,$start,$mid-$start,$find); } elseif ($find>$arr[$mid]) //大于中间值,递归,求长度是$end-$mid,初始值为$mid+1原理同上 { return besearch($arr,$mid+1,$end-$mid,$find); } } $a =[1,5,9,15,25,46,98]; //定义了一个数组,采用短数组定义法,数组类型为索引数组,省略了键值,默认从0开始,和C++数组类似 echo besearch($a,2,4,10); //回显这个函数返回值,返回的是return的值,也就意味着原函数如果执行了return,将回到此处,也意味着原函数将停止循环。 //部分注释是后面手打,遇到格式问题请删除注释。 ?>