非递归实现
<?php
function binary_search($list, $item)
{
$low = 0;
$high = count($list) - 1;
while ($low <= $high) {
if (($low + $high) % 2 == 0) {
$mid = ($low + $high) / 2;
} else {
$mid = floor(($low + $high) / 2);
}
$guess = $list[$mid];
if ($guess == $item) {
return $mid;
}
if ($guess > $item) {
$high = $mid - 1;
}
if ($guess < $item) {
$low = $mid + 1;
}
}
return null;
}
$list = [0, 1, 2, 3, 4, 5, 10];
var_dump(binary_search($list, 10));
以递归方式实现
<?php
function binary_search($list, $low, $high, $item)
{
if ($low <= $high) {
if (($low + $high) % 2 == 0) {
$mid = ($low + $high) / 2;
} else {
$mid = floor(($low + $high) / 2);
}
if ($list[$mid] == $item) {
return $mid;
}
if ($list[$mid] > $item) {
return binary_search($list, $low, $mid - 1, $item);
}
if ($list[$mid] < $item) {
return binary_search($list, $mid + 1, $high, $item);
}
} else {
return null;
}
}
$list = [100, 102, 202, 302, 402, 502, 1011];
var_dump(binary_search($list, 0, count($list) - 1, 502));