Code kata: binary search

  • Posted on
  • by

Продолжение http://friendfeed.com/kkapp/b5d3658c.

Уложился быстрее чем вчера, потому что помню, что код упрощается, если границы двигать не на середину, как положено по книжкам, а сразу за неё ($mid ± 1).

#! /usr/bin/perl
use strict;
use warnings;

use Test::Most;
use Data::Dump;

sub bsearch {
	my ($what, @where) = @_;

	my ($left, $right) = (0, $#where);

	while ($right >= $left) {
		my $mid = int(($right - $left) / 2) + $left;

		if	($where[$mid] == $what) {
			return $mid;
		}
		elsif ($where[$mid] < $what) {
			$left = $mid + 1;
		}
		else {
			$right = $mid - 1;
		}
	}

	return -1;
}

is(bsearch(0, 0), 0);
is(bsearch(0, 1), -1);
is(bsearch(1, 1), 0);
is(bsearch(1, 1, 2, 3), 0);
is(bsearch(1, -6, -5, 1, 2, 3), 2);
is(bsearch(0, -6, -5, -3, -1, 0), 4);
is(bsearch(3, 0, 0, 0, 0, 0, 0, 3), 6);
is(bsearch(4, 0, 0, 0, 0, 0, 0, 3), -1);
is(bsearch(1), -1);

done_testing;