<?php
/*
* 算法要求:1,顺序的存储结构。2,按大小有序排列
*
* 算法查找过程:假设是一张升序的表,
* 1,关键字与中间位置比较,相等则查找成功。
* 2,大于中间位置,则将表对半拆,取后半段的表,然后重新对比中间位置的值。
* 3,小于中间位置,则将表对半拆,取前半段的表,然后重新对比中间位置的值。
* 4,如果中间位置与开始位置相等,则查找失败。
* Author: lms <php7在qq.com> QQ:二一九二4238
* 转发请注明来源网址
* http://www.thinkunion.net
* https://blog.csdn.net/weixin_43932088
*/
/*循环方式*/
function find_me($arr, $me){
$begin=0;
$end=count($arr);
/*向下取整*/
$mid=floor(($begin+$end)/2);
while (true) {
/*找到了*/
if($me==$arr[$mid]){
return $mid+1;
/*大的一半*/
}elseif($me>$arr[$mid]){
$begin=$mid;
$mid=floor(($begin+$end)/2);
/*小的一半*/
}elseif($me<$arr[$mid]){
$end=$mid;
$mid=floor(($begin+$end)/2);
}
/*找不到*/
if($mid==$begin){
return false;
}
}
}
/*递归方式*/
function find_me2($arr, $me, $begin, $end){
$mid=floor(($begin+$end)/2);
/*找到了*/
if($me==$arr[$mid]){
return $mid+1;
/*大的一半*/
}elseif($me>$arr[$mid]){
find_me2($arr, $me, $mid, $end);
/*小的一半*/
}elseif($me<$arr[$mid]){
find_me2($arr, $me, $begin, $mid);
}
/*找不到*/
if($mid==$begin){
return false;
}
}
$arr=[1,2,3,4,5,6,7,8,9];
$me=2;
var_dump(find_me($arr,$me));
var_dump(find_me($arr,$me,0,count($arr)));