查找过程:
将n个元素分成大致相等的两部分,取a[n/2]与x做比较,如果x=a[n/2],则找到x,算法中止;如果x<a[n/2],则只要在数组a的左半部分继续搜索x,如果x>a[n/2],则只要在数组a的右半部搜索x。
算法要求:
1.必须采用顺序存储结构。
2.必须按关键字大小有序排列。
代码实现:
/**
* 二分查找算法
*
* @param array $arr
* @param $needle
*
* @return int
*/
function binarySearch(array $arr, $needle)
{
if (!is_array($arr) || empty($arr)) {
return -1;
}
$lower = 0;
$high = count($arr) - 1;
while ($lower <= $high) {
$middle = intval(($lower + $high) / 2);
if ($needle < $arr[$middle]) {
$high = $middle - 1;
} elseif ($needle > $arr[$middle]) {
$lower = $middle + 1;
} elseif ($needle == $arr[$middle]) {
return $middle;
}
}
return -1;
}
//$arr = [23, 45, 67, 89, 90, 134, 236];
//print_r(binarySearch($arr, 134));