Skip to content

Instantly share code, notes, and snippets.

@darraghenright
Created February 15, 2012 09:09
Show Gist options
  • Save darraghenright/1834615 to your computer and use it in GitHub Desktop.
Save darraghenright/1834615 to your computer and use it in GitHub Desktop.
a simple divide-and-conquer, return-the-index-of-a-value-if-it-exists-in-an-array function :)
<?php
function bisect($haystack, $needle, $trace = false)
{
$min = 0;
$max = count($haystack);
$match = false;
do {
$mid = (int) (($max + $min) / 2);
$val = $haystack[$mid];
$loop = !(($min == $mid) || ($max == $mid));
if ($needle == $val) {
$match = true;
break;
}
($needle > $val) ? $min = $mid : $max = $mid;
} while ($loop);
if ($trace) {
printf("needle: %s; index: %s # => %s : ", $needle, $mid, $haystack[$mid]);
}
return $match ? $mid : false;
}
// run!
system('clear');
$arr = range(0, 50, 5);
print_r($arr);
var_dump(bisect($arr, 101));
var_dump(bisect($arr, 51));
var_dump(bisect($arr, 50));
var_dump(bisect($arr, 49));
var_dump(bisect($arr, 31));
var_dump(bisect($arr, 1));
var_dump(bisect($arr, 0));
var_dump(bisect($arr, -1));
echo 'done';
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment