一、查找思路
以数组为例
> (1)首先,将数组以value值进行升序排序,
> (2)将数组中间位置的元素与查找元素比较,如果两者相等,则查找成功;否则利用中间位置记录将数组分成前、后两个子数组,如果中间位置记录的元素大于查找元素,则进一步查找前一子数组,否则进一步查找后一子数组。
> (3)重复以上过程,直到找到满足条件的记录,使查找成功,或直到子数组不存在为止,此时查找不成功。
二、二分查找
1、递归查询
/**
* @param $arr 原数组
* @param $search 查找的元素
* @param $start 数组开始位置
* @param $end 数组结束位置
* @return float|string 返回待查找元素的下标
*/
function binSearch($arr,$search,$start = 0,$end){
if($start <= $end){
$mid = floor(($start + $end) / 2); //获取中间元素的下标(中间值)
if($arr[$mid] == $search){
return $mid; //返回待查找元素的下标
}elseif($arr[$mid] < $search){
//所查值大于中间值
//则数组下标$mid左边的值都小于$search,此时要将($mid + 1)赋值给$start ,实现从右侧子数组中查询
$start = $mid + 1;
binSearch($arr,$search,$start,$end);
}elseif($arr[$mid] > $search){
//所查值小于中间值
//则数组下标$mid右边的所有值都大于$search,此时要将($mid - 1)赋值给$end,实现从左侧子数组中查询
$end = $mid - 1;
binSearch($arr,$search,$start,$end)
}
}
return "查找失败";
}
//已经排好序的数组
$arr = [1,3,55,77,88];
//待查询的元素
$search = 22;
//调用方法
echo binSearch($arr,$search,0,count($arr)-1);
2、循环查询
/**
* @param $arr 原数组
* @param $search 查找的元素
* @return float|string 返回待查找元素的下标
*/
function binSearch($arr,$search){
$end = count($arr) - 1; //数组的尾下标
$start = 0; //数组的头下标
while($start <= $end){
$mid = floor(($start + $end) / 2); //获取中间元素的下标(中间值)
if($arr[$mid] == $search){
return $mid; //返回待查找元素的下标
}elseif($arr[$mid] < $search){
//所查值大于中间值
//则数组下标$mid左边的值都小于$search,此时要将($mid + 1)赋值给$start
$start = $mid + 1;
}elseif($arr[$mid] > $search){
//所查值小于中间值
//则数组下标$mid右边的所有值都大于$search,此时要将($mid - 1)赋值给$end
$end = $mid - 1;
}
}
return "查找失败";
}
//已经排好序的数组
$arr = [1,3,55,77,88];
//待查询的元素
$search = 22;
//调用方法
echo binSearch($arr,$search);