折半查找,也称二分查找,在某些情况下相比于顺序查找,使用折半查找算法的效率更高。但是该算法的使用的前提是静态查找表中的数据必须是有序的。
在折半查找之前对查找表按照所查的关键字进行排序的意思是:若查找表中存储的数据元素含有多个关键字时,使用哪种关键字做折半查找,就需要提前以该关键字对所有数据进行排序。
这里我使用了递归的方法来进行折半查找
function halfSearch($target, $start, $end, $arrays)
{
if ($start <= $end) {
var_dump($arrays[$start], $arrays[$end]);echo "<hr>";
$middle = (int)(($end + $start) / 2);
if ($target == $arrays[$middle]) {
return true;
} elseif ($target < $arrays[$middle]) {
return banSearch($target, $start, $middle - 1, $arrays);
} else {
return banSearch($target, $middle + 1, $end, $arrays);
}
}
return false;
}
$arr = [1, 3, 4, 5, 7, 8, 9, 10, 23, 45, 67, 89, 90, 91, 92, 93, 94, 95, 96, 97];
$target = 96;
$start = 0;
$end = count($arr) - 1;
$find = halfSearch($target, $start, $end, $arr);
var_dump($find);
// 打印出的结果为
/**
int(1) int(97)
int(67) int(97)
int(93) int(97)
int(96) int(97)
bool(true)
**/
可以看出二分法查找逐步接近目标