В исправленном коде используется $n
, но он никогда не устанавливается. Если бы вы использовали use warnings;
и use strict;
, вы бы знали об этой проблеме. С этими директивами я получаю:
$ perl comb.pl
Global symbol "$n" requires explicit package name at comb.pl line 20.
Execution of comb.pl aborted due to compilation errors.
$
В коде всего 5 переменных, включая $n
, поэтому my
нужно только 5 раз.
Если для $n
установлено начальное значение $gap
(также известное как scalar(@tab)
), код сортирует ваш набор данных и мой.
#!/usr/bin/env perl
use strict;
use warnings;
my @tab = ( 19, 13, 2, 5, 3, 11, 17, 7 );
#my @tab = (1,3,5,22,2,12,1);
my $gap = scalar(@tab);
my $replace = 1;
my $n = $gap;
print "Unsorted array: @tab\n";
while ($gap>1 || $replace)
{
$gap = ($gap * 10) / 13;
$gap = 1 if ($gap == 0);
print "Gap = $gap\n";
$replace = 0;
for (my $i=0; $i+$gap < $n; $i++)
{
if ($tab[$i]>$tab[$i+$gap])
{
($tab[$i], $tab[$i+$gap]) = ($tab[$i+$gap],$tab[$i]);
$replace = 1;
}
}
}
print "Sorted array: @tab\n";
Пример запуска ваших данных
Unsorted array: 1 3 5 22 2 12 1
Gap = 5.38461538461539
Gap = 4.14201183431953
Gap = 3.18616294947656
Gap = 2.45089457652043
Gap = 1.88530352040033
Gap = 1.45023347723102
Gap = 1.11556421325463
Gap = 0.85812631788818
Sorted array: 1 1 2 3 5 12 22
Пример запуска моих данных
Unsorted array: 19 13 2 5 3 11 17 7
Gap = 6.15384615384615
Gap = 4.73372781065089
Gap = 3.64132908511607
Gap = 2.80102237316621
Gap = 2.15463259474323
Gap = 1.65740968826403
Gap = 1.27493052943387
Gap = 0.980715791872205
Sorted array: 2 3 5 7 11 13 17 19
Если вы планируете задать какие-либо вопросы о Perl на SO, убедитесь, что вы исправили все очевидные проблемы, о которых сообщалось, используя use strict;
и use warnings;
, или, если вы не можете, ваш вопрос должен быть о том, как исправить конкретное предупреждение или ошибка, которую вы получаете.
Не забудьте изучить, как создать MCVE (минимальный, полный, проверяемый пример) или SSCCE (Короткий, автономный, правильный пример) два имени и ссылки для одной и той же основной идеи.
person
Jonathan Leffler
schedule
03.06.2015
==
в perl.eq
— это сравнение строк. Вам нужноif( $gap == 0)
Такжеint
— это функция. Perl не поддерживает типы. - person Cfreak   schedule 03.06.2015use strict;
,use warnings;
иmy
. Это не предвещает ничего плохого... По крайней мере, защитите себя от намека на то, что вы не знаете об этих важных инструментах, показав, что вы их используете. - person Jonathan Leffler   schedule 03.06.2015use strict
иuse warnings
? - person Sean   schedule 03.06.2015my @tab = ( 19, 13, 2, 5, 3, 11, 17, 7 );
иmy $n = scalar(@tab);
и функцию печати, которая показывает состояние массива до и после. Это дополнительные 10 строк кода, но от них зависит, насколько хорошо будет воспринят ваш вопрос. Неизвестно, что в вспомогательном коде могут быть проблемы... показ этого означает, что мы можем это исправить. Вы напечатали$gap
?swap
не является основной функцией; вы тестировали его? Покажи это! - person Jonathan Leffler   schedule 03.06.2015