sub binarySearch { my ($begin, $query, $array) = @_; return 0 if $query < $array->[0] and $begin == 1; return $#$array if $query > $array->[$#$array] and $begin == 0; my ($left,$right,$prevCenter, $center) = (0, $#$array, -1); while(1) { $center = int (($left + $right)/2); if ($query == $array->[$center]) { if ($begin == 1) { $center-- until $center == 0 or $array->[$center] != $array->[$center-1]; } else { $center++ until $center == $#$array or $array->[$center] != $array[$center+1]; } return $center; } if ($center == $prevCenter) { return $right if $begin == 1; return $right-1 if $begin == 0; } $right = $center if $query < $array->[$center]; $left = $center if $query > $array->[$center]; $prevCenter = $center; } }