一、递归方法实现二分法查找:
注:前提是数组是有序数组;
原理:
1)先计算出数组的中间值并向上取整
2)判断中间值是否和要查找的值相同,相同则直接返回
3)不相同就判断大小如果比中间值大,就用array_slice从中间的下一个位置截取片段生成新数组,反之同样方法截取片段。
4)然后用递归的手法,直至找到相应元素,如果到最后也没有找到,也就是数组长度为1时还没有找到,就直接返回没有此元素;
function secSearch($data , $search){
$mid = ceil(count($data) / 2) - 1;
if( $data[$mid] == $search ){
return $data[$mid];
}
if( count($data) == 1 ){
return '没有找到';
}
if($data[$mid] > $search){
$data = array_slice($data,0,$mid);
return twoF( $data,$search );
}
if( $data[$mid] < $search){
$data = array_slice($data,$mid+1);
return twoF( $data,$search );
}
}
二、普通方式实现
原理:
1)定义一个最小值和最大值,最小值为0,最大值为数组长度减1
2)while循环判断当最小值小于等于最大值时,定义一个中间值,为最大值和最小值的和除以2
3)如果中间值和要查找的值刚好相等,直接跳出循环
4)如果不相等,无非两种情况,大于或小于,当大于中间值时,给最小值赋值为中间值+1,小于时给最大值赋值为中间值减1,直至找到,或者当最大值小于最小值时跳出循环,返回找到或没找到
function search($data ,$search){
$low = 0;
$high = count($data) - 1;
while( $low <= $high ){
$mid = floor( ($low + $high) / 2 );
if( $data[$mid] == $search ){
return $data[$mid];
}
if( $data[$mid] > $search ){
$high = $mid - 1;
}
if($data[$mid] < $search){
$low = $mid + 1;
}
}
return '没有找到';
}