如何在Perl中创建冒泡排序

时间:2015-03-20 15:09:36

标签: perl sorting

我正在尝试在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;
        }
    }
}

然后当我再次遍历数组时,它没有被排序。

3 个答案:

答案 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";