关闭

PHP二分法(折半查找)

126人阅读 评论(0) 收藏 举报
二分法思想:
首先前提是要查找的数组对象是有序数组,这里以从小到大为例,
然后所谓折半就是,每次将目标数组一分为二,取出位于数组中间的那个值,这里记为$a[$middle]
$a[$middle]比我们要查找的数,那说明我们要查找的部分位于$a[$middle]值的右边
从而利用递归再对右侧的数组进行同样的算法,直到结束为止。
反之,$a[$middle]比我们要查找的数,那说明我们要查找的部分位于$a[$middle]值的左边,
从而利用递归再对右侧的数组进行同样的算法,直到结束为止。
若最终未找到则返回-1;

非递归方法
function Search($arr = array(), $value) {
$left = 0; $right = count($arr)-1;
while($left <= $right) {
$middle = floor(($left + $right) / 2);//数组中间下标
$flag = $arr[$middle] < $value ? -1 : ($arr[$middle] == $value ? 0 : 1);
switch($flag) {
case -1 : $left = $middle + 1; break;
case 0 : return $middle;
case 1 : $right = $middle-1; break;
}
}
return -1;
}


递归方法
$array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
echo bSearch($array, 5, 0, count($array)-1);
function Search($arr= array(),$val,$left,$right){
if ($left<$right)
$middle = floor(($left+$right)/2);
$f = $arr[$middle]<$val?-1:($arr[$middle]==$val?0:1);//$a[$middle]比我们要查找的数,则$f为-1,若相等则为0,否则为1
switch ($f){
case -1:return Search($arr, $val, $middle+1, $right);
break;
case 0:return $middle;
break;
case 1:return Search($arr, $val, $left, $middle-1);
   break;
}
}
return -1;
}



0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:32624次
    • 积分:682
    • 等级:
    • 排名:千里之外
    • 原创:76篇
    • 转载:8篇
    • 译文:0篇
    • 评论:0条
    文章分类