算法原理:
- 二分法查找适用于数据量较大时,但是数据需要先提前排好顺序。(必须是顺序存储的数据!)
- 确定该数组中间元素位置:intval(0+(count($arr)-1))/2))
- 如果中间位置的元素值,与要查找的值相等,则直接返回。
- 如果中间位置的元素值,与要查找的值不相等,则需要确定新的查找区域,继续二分法查找。
- 如果要查找的值,大于中间值,则查找区域为:从中间值下标+1,到数组末尾。
- 如果要查找的值,小于中间值,则查找区域为:从0到中间值下标-1。
- 依次类推…………
![](https://i-blog.csdnimg.cn/blog_migrate/3625a2261b2b4c2162b665e65c3898d8.png)
代码实现:
<?php
//二分法查找算法查找数组中的值:注意【每次确定中间下标】
function order($search, $numbers) {
$low = 0;//最小下标
$high = count($numbers) - 1;//最大下标
while ($low <= $high) {
//求中间下标,并取整
$mid = intval(($low + $high) / 2);
//如果中间下标元素与目标元素一致,则退出循环
if ($numbers[$mid] == $search) {
return $mid;
} else if ($numbers[$mid] < $search) {
//如果中间下标元素小于目标元素,则目标元素在数组后半部分,最小值下标变更为原中间下标+1
$low = $mid + 1;
} else if ($numbers[$mid] > $search) {
//如果中间下标元素大于目标元素,则目标元素在数组前半部分,最小值下标变更为原中间下标-1
$high = $mid - 1;
}
}
}
//待查数组为从小到大的顺序,如果为从大到小,则更改判断部分的比较运算符
$arr1 = array(1, 2, 3, 4, 5, 6, 7, 8, 9);
$search1 = 7;
echo "元素'{$search1}'的数组下标为:" . order($search1, $arr1);
echo "<hr/>";
?>
运行结果:
![](https://i-blog.csdnimg.cn/blog_migrate/abcc8c2170475a667cdac944b3ce0059.png)