Comb_sort не работает в Perl

Я написал гребенчатую сортировку на Perl. Вроде все хорошо, но программа не работает и компилятор ошибок не выдает. Я хотел бы попросить вас о помощи. Код:

@tab = (1,3,5,22,2,12,1);
$gap = scalar(@tab);
$replace = 1;

while ($gap>1 || $replace)
{
    $gap = ($gap * 10) / 13;
    if ($gap == 0)
    {        
        $gap = 1;
    }

    $replace = 0;
    for ($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";

person Plusce    schedule 02.06.2015    source источник
comment
Числовое сравнение == в perl. eq — это сравнение строк. Вам нужно if( $gap == 0) Также int — это функция. Perl не поддерживает типы.   -  person Cfreak    schedule 03.06.2015
comment
Нет переменных use strict;, use warnings; и my. Это не предвещает ничего плохого... По крайней мере, защитите себя от намека на то, что вы не знаете об этих важных инструментах, показав, что вы их используете.   -  person Jonathan Leffler    schedule 03.06.2015
comment
Вы просите компилятор показать вам как можно больше ошибок с use strict и use warnings?   -  person Sean    schedule 03.06.2015
comment
Обратите внимание, что вы должны показать нам MCVE (минимальный, полный, проверяемый пример). Это даже не очень сложно. Вы можете создать my @tab = ( 19, 13, 2, 5, 3, 11, 17, 7 ); и my $n = scalar(@tab); и функцию печати, которая показывает состояние массива до и после. Это дополнительные 10 строк кода, но от них зависит, насколько хорошо будет воспринят ваш вопрос. Неизвестно, что в вспомогательном коде могут быть проблемы... показ этого означает, что мы можем это исправить. Вы напечатали $gap? swap не является основной функцией; вы тестировали его? Покажи это!   -  person Jonathan Leffler    schedule 03.06.2015
comment
Хорошо, я улучшил верхний код. Ранее я скопировал неконвертированную функцию (я "перевожу" ее с C++), моя ошибка. Теперь сортировка все еще не работает - я не могу напечатать количество $gap. Что я могу сделать? Я также установил использование строгих и использование предупреждений. Компилятор только сообщает, что для моих переменных требуется явный пакет (я написал свою первую большую программу на Perl, и я много раз использую одни и те же имена переменных).   -  person Plusce    schedule 03.06.2015


Ответы (1)


В исправленном коде используется $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
comment
Спасибо :). Теперь все работает так, как я хотел. Я буду помнить ваши советы. - person Plusce; 03.06.2015