如何在 Perl 中创建冒泡排序

use*_*666 5 sorting perl

我正在尝试在 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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Hyn*_*dil -1

您应该使用列表版本来避免这种混乱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";
Run Code Online (Sandbox Code Playgroud)

您可以通过这种方式防止很多错误,并且代码更具可读性,因为您想要实现的意图清晰可见。这导致你意识到你的算法是错误的,你可能想要的是

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";
Run Code Online (Sandbox Code Playgroud)