php 二分查找
//已经排序好的数组 二分查找--递归--返回数组的索引--返回-1 就是找不到 $left 最左边索引 $right--最右边索引
function twoFinds($array,$find,$left,$right){
//左边大于右边-超出查找范围-找不到数据
if($left>$right){
return -1;
}
//获取数组的中间值索引
echo $middle=ceil(($left+$right)/2);
echo "<br/>";
//要查好的数组的中间值
$array_middle=$array[$middle];
//查找到数据
if($find==$array_middle){
return $middle;
}else if($array_middle>$find){
//中间数据大于要查找数据--左边查找
return twoFinds($array,$find,0,$middle-1);
}else{
//中间数据大于要查找数据--右边查找
return twoFinds($array,$find,$middle+1,$right);
}
}
$array=[2,6,8,23,32,55,56,77,88,90];
echo count($array)-1;
echo "<br/>";
echo twoFinds($array,77,0,count($array)-1);
//已经排序好的数组 二分查找--递归--返回数组的索引--返回-1 就是找不到 $left 最左边索引 $right--最右边索引
function twoFinds($array,$find,$left,$right){
//左边大于右边-超出查找范围-找不到数据
if($left>$right){
return -1;
}
//获取数组的中间值索引
$middle=ceil(($left+$right)/2);
//要查好的数组的中间值
$array_middle=$array[$middle];
//查找到数据
if($find==$array_middle){
return $middle;
}else if($array_middle>$find){
//中间数据大于要查找数据--左边查找
return twoFinds($array,$find,0,$middle-1);
}else{
//中间数据大于要查找数据--右边查找
return twoFinds($array,$find,$middle+1,$right);
}
}
//已经排序好的数组 二分查找--非递归--返回数组的索引--返回-1 就是找不到 $left 最左边索引 $right--最右边索引
function twoFinds1($array,$find,$left,$right){
//左右索引初始值
$ldefult=$left;
$rdefult=$right;
//建立循环查找,找到找不到再跳出循环
while (true){
//左边大于右边-超出查找范围-找不到数据
if($ldefult>$rdefult){
return -1;
break;
}
//获取数组的中间值索引
$middle=ceil(($ldefult+$rdefult)/2);
//要查好的数组的中间值
$array_middle=$array[$middle];
//找打啦
if($find==$array_middle){
return $middle;
break;
}else if($array_middle>$find){
//左边查找
//处理右边的边界
$rdefult=$middle-1;
}else{
//右边查找
//处理左边的边界
$ldefult=$middle+1;
}
}
}
$array=[2,6,8,23,32,55,56,77,88,90];
echo count($array)-1;
echo "<br/>";
echo twoFinds1($array,88,0,count($array)-1);
echo "<br/>";
echo twoFinds($array,88,0,count($array)-1);
不逼一下自己,都不知道自己有多优秀!!!

浙公网安备 33010602011771号