假设数组已经排好顺序
* binarysearch.php
<?php
function binarysearch(array $a, $item, callable $c = null) {
$low = 0;
$high = count($a) - 1;
if (null == $c) {
$c = function($a, $b) {
return $a - $b;
};
}
while ($low <= $high) {
$mid = floor( ($high-$low)/2 + $low );
if ($c($a[$mid], $item) < 0) {
$low = $mid + 1;
} else if ($c($a[$mid], $item) > 0) {
$high = $mid - 1;
} else {
return $mid;
}
}
return -1;
}
test:
* index.php
<?php
include './binarysearch.php';
$a = ['b', 'e', 'h', 'i', 'n', 'p', 'r', 's', 'y'];
$c = function($a, $b) {
return strcmp($a, $b);
};
echo binarysearch($a, 'b', $c).PHP_EOL;
echo binarysearch($a, 'p', $c).PHP_EOL;
echo binarysearch($a, 'y', $c).PHP_EOL;
0
5
8