Реализации алгоритмов/Двоичный поиск: различия между версиями

Содержимое удалено Содержимое добавлено
Примеры для C# и Python оптимизированы; добавлены рекурсивные варианты
Строка 243:
}
</source>
 
==[[w:Perl|Perl]]==
<source lang="perl">
 
#Что искать?:
my @search = qw{88 2 15 92 45 66 98 8 17 77};
#Где?:
my @seq = qw{2 4 8 10 11 12 13 14 17 18 20 21 22 23 26 27 31 32 33 34 37 43 44 45 49 51 52 54 57 60 61 63 64 66 67 68 70 75 76 79 80 81 82 83 86 89 92 96 97 98};
 
#Показать результаты поиска чисел в числовом ряду
print bin_search(\@seq, $_) for @search;
 
#алгоритм поиска
sub bin_search{
my ($lst, $x) = @_;
#0й элемент - текущий индекс; -1 - мин; 1 - макс
my @idx = (undef, $#{$lst}, 0);
my $cnt = 0;
 
while($idx[-1] <= $idx[1]){
$idx[0] = int(($idx[-1] + $idx[1]) / 2);
++$cnt;
 
#Места с 0 считаются
return("$x найден на $idx[0] месте за $cnt шагов\n") if($x == $lst->[$idx[0]]);
 
($x < $lst->[$idx[0]])?
($idx[1] = $idx[0] - 1):
($idx[-1] = $idx[0] + 1);
}
 
return "$x не найден\n";
}
 
</source>