我用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";发布于 2015-06-03 01:19:19
修改后的代码使用$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))后,代码会对数据集OK进行排序,并对数据集进行排序。
#!/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的问题,请确保您已经修复了使用use strict;和use warnings;报告的所有明显问题--或者,如果不能,您的问题应该是如何修复所收到的特定警告或错误。
请记住学习如何创建一个MCVE (最小、完整、可验证的示例)或SSCCE (简短的,完整的,正确的例子) -两个名称和链接为相同的基本想法。
https://stackoverflow.com/questions/30608175
复制相似问题