Php 数组中的二进制搜索

Php 数组中的二进制搜索,php,arrays,Php,Arrays,我为二进制搜索编写了这段代码 但它也有一些问题。有人能帮我写更好的代码吗 函数bs($a,$val,$low,$high){ 如果($高$val){ 返回bs($a,$val,$low,$mid-); }否则,如果($a[$mid]值) 返回二进制搜索(A、值、低、中1) else if(A[mid]

我为二进制搜索编写了这段代码 但它也有一些问题。有人能帮我写更好的代码吗

函数bs($a,$val,$low,$high){
如果($高<$低){
返回打印“未找到”;
}
$mid=$low+($high-$low)/2);
如果($a[$mid]>$val){
返回bs($a,$val,$low,$mid-);
}否则,如果($a[$mid]值)
返回二进制搜索(A、值、低、中1)
else if(A[mid]<值)
返回二进制搜索(A,值,中+1,高)
其他的
返回中//找到
}

问题是你必须投

(($high-$low)/2)
整型

intval(($high-$low)/2)
也叫

bs ($a,$val,$low,$mid--);
bs ($a,$val,$low,$mid++);
将在函数调用后减少/增加$mid,因此您应该使用

bs ($a,$val,$low,$mid-1);
bs ($a,$val,$low,$mid+1);
此外,PHP代码与您在下面编写时发布的伪代码不匹配

return bs ($a,$val,$low,$mid+1);
应该是

return bs ($a,$val,$mid+1,$high);
最后我不认为

return print 'found';
return print 'not found';
将给出预期的行为:

return -1;
return $mid;
所以整件事就变成了

function bs ($a,$val,$low,$high){
    if ($high < $low){
        return -1;
    }
    $mid= $low + intval(($high-$low)/2);
    if ($a[$mid]>$val){
        return bs ($a,$val,$low,$mid-1);
    }else if  ($a[$mid]<$val){
        return bs ($a,$val,$mid+1,$high);
    }else{
        return $mid;
    }
}

$array=array(1,2,3,4,5,6,7);
$idx = bs ($array,5,0,6); 

if($idx==-1)
{
    echo 'not found';
}
else
{
    echo 'Found at index' . $idx;
}
函数bs($a,$val,$low,$high){
如果($高<$低){
返回-1;
}
$mid=$low+intval($high-$low)/2);
如果($a[$mid]>$val){
返回bs($a、$val、$low、$mid-1);
}else if($a[$mid]
$data_set=[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21];
$search_item=19;
函数二进制搜索($search\u item,$data\u set){
$start=0;
$end=计数($data\u set)-1;
while($start$data\u set[$mid]){
$start=$mid+1;
}elseif($search\u item==$data\u set[$mid]){
返回'index='.$mid.'和value='.$search\u项;
}
}
返回-1;
}
变量转储(二进制搜索($search\u item,$data\u set));

但是有一些问题
——如果您不告诉我们,我们怎么知道问题出在哪里?什么不起作用?预期的结果是什么?您得到了什么?致命错误:允许的1073741824字节的内存已用尽(尝试分配65488字节)在第15行的D:\xampp\htdocs\bin2.php中,看起来您可能有一个带有递归函数的无限循环。您没有考虑非偶数除法。$mid可能会变成类似于
2.5
,然后变成2.25、2.125等等……并且您永远不会停止递归。
$data_set = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21];
$search_item = 19;

function binary_search($search_item,$data_set){
    $start = 0;
    $end = count($data_set) - 1;
    while($start <= $end ){
        $mid = floor(($start + $end) / 2);
        if($search_item < $data_set[$mid]){
            $end = $mid - 1;
        }elseif($search_item > $data_set[$mid]){
            $start = $mid + 1;
        }elseif($search_item == $data_set[$mid]){
            return 'index=='.$mid.' and value=='.$search_item;
        }
    }
    return -1;
}

var_dump(binary_search($search_item,$data_set));