二分查找(折半查找) 数组元素有序 数组的元素必须有顺序,从小到大或者从大到小。
1、定义一个有序的数组
<?php
$max = 10000; // 数组最大值
$number = 1; // 数组开始值
$arr = []; // 数组
while ( $number <= $max ){
$arr[] = $number;
$number ++ ;
}
?>
// 1、二分查找
// $arr 数组 $low数组key最小值 $high 数组key最大 ,搜索 $k 值 。 $low - $high 搜索的范围
// 例如 0 - 5 在数组 第一个元素到第六个元素 之间 搜索 $k
function bin_sch($arr,$low,$high,$k){
if($low <= $high ){
$mid = intval(($low + $high)/2);
if( $arr[$mid] == $k ){
return $arr[$mid];
}
if( $k < $arr[$mid]){
return bin_sch($arr,$low,$mid-1,$k);
}
if($k > $arr[$mid]){
return bin_sch($arr,$mid+1,$high,$k);
}
}
return '';
}
// 2、二分查找
function bin_sch2($arr,$value)
{
$low = 0 ;
$max = count($arr) -1;
$mid = ($low + $max)/2;
while ($value != $arr[$mid]){
// 搜索值 大于 之间值
if($value > $arr[$mid]){
$mid = $mid + 1;
}
// 搜索值 小于 之间值
if($value < $arr[$mid]){
$mid = $mid - 1;
}
// 防止死循环
if($mid >= $max || $mid <= 0){
// 没有找到
return -1;
}
}
return $arr[$mid];
}