我正在尝试在Perl中创建一个简单的冒泡排序,但它似乎不起作用。任何人都可以帮助我吗?
代码:
for ( my $i = 1; $i < @array; $i++ ) {
for ( my $k = 0; $k = @array < $i - 1; $k++ ) {
if ( $array[$k] > $array[ $k + 1 ] ) {
$temp = $array[$k];
$array[$k] = $array[ $k + 1 ];
$array[ $k + 1 ] = $temp;
}
}
}
然后当我再次遍历数组时,它没有被排序。
答案 0 :(得分:0)
外环不应该从阵列的后面走到前面吗?此内部循环中的$k = @array< $i - 1
语句也没有意义。
my @array = (5,6,3,1,7,3,2,9,10,4);
my $i, $k;
for ($i = $#array; $i > 0; $i--) { # $#array = last index = length-1
for ($k = 0; $k < $i; $k++) {
if ($array[$k] > $array[$k+1]) {
($array[$k], $array[$k+1]) = ($array[$k+1], $array[$k]);
}
}
}
print "@array\n"; # 1 2 3 3 4 5 6 7 9 10
答案 1 :(得分:-1)
我无法相信没有人给他真正的PERL答案。我相信他在Perl中要求它,而不是用C转录到Perl:)
for($i=$#a;$i>0;$i--){$m=$a[0];splice(@a,0,$i+1,map{$s=$m;$m>$_?$_:($s,$m=$_)[0]}@a[1..$i],$m);}
答案 2 :(得分:-3)
您应该使用for
my @array = ( 5, 6, 3, 1, 7, 3, 2, 9, 10, 4 );
for my $i ( 1 .. $#array ) {
for my $k ( 0 .. $i - 1 ) {
@array[ $k, $k + 1 ] = @array[ $k + 1, $k ]
if $array[$k] > $array[ $k + 1 ];
}
}
print "@array\n";
您可以通过这种方式防止大量错误,并且代码更具可读性,因为有明确可见的意图您希望实现什么。这导致您的算法错误以及您可能想要的是
my @array = ( 5, 6, 3, 1, 7, 3, 2, 9, 10, 4 );
for my $i ( reverse 1 .. $#array ) {
for my $k ( 0 .. $i - 1 ) {
@array[ $k, $k + 1 ] = @array[ $k + 1, $k ]
if $array[$k] > $array[ $k + 1 ];
}
}
print "@array\n";