二分查找算法是一种在有序数组中查找某一特定元素的搜索算法。
1.描述
搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜 素过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果在某一步骤数组 为空,则代表找不到。
这种搜索算法每一次比较都使搜索范围缩小一半。折半搜索每次把搜索区域减少一半,时间复杂度为Ο(logn) 。
2.逻辑
1、规定起始和结束位置(开始和最后的元素)
2、找到规定区间的中间数为基数,与要查找的数字进行对比
3、如果基数比要查询的数字大,则区间的结束位置为小于基数,如果基数要比查询的数字小,则区间的开始位置为大于基数
4、将重新获得的区间重复第2,3步
5、查询完成,如果查询到输出对应的键名,查询不到,输出false
3.代码
$arr=[8, 15, 20, 22, 29, 49, 50, 50, 100, 101];
function dichotomySearch($arr, $number)
{
$arrSize = count($arr);
//规定起始值和最终值的位置,从数组开始到数组结束
$begin = 0;
$end = $arrSize - 1;
while ($begin <= $end) {
//计算出规定位置的中间值
$middle = floor(($begin + $end) / 2);
if ($number < $arr[$middle]) {
//如果要查找的数字小于 中间数,则 最终值 变为 中间值-1
$end = $middle - 1;
} elseif ($number > $arr[$middle]) {
//如果要查找的数字大于 中间数,则 起始值 变为 中间值+1
$begin = $middle + 1;
} else {
//如果要查找的数字等于 中间数,搜索完成
return [$middle => $number];
}
}
//搜索不到,返回false
return false;
}
var_dump(dichotomySearch($arr, 29));
附上参考连接
菜鸟教程《十大编程算法助程序员走上高手之路》
https://www.runoob.com/w3cnote/the-friendship-algorithm-the-big-bang-theory.html