Acme-Tools
view release on metacpan or search on metacpan
t/test_perm.pl view on Meta::CPAN
my $n=shift()||4;
my@a=(1..$n);
while(1){
print join(" ", @a)."\n";
my $k=$n-2; 1 while $a[$k]>$a[$k+1] and $k--; last if $k<0;
my $l=$n-1; 1 while $a[$k]>$a[$l] and $l-->$k;
@a[$k,$l]=@a[$l,$k];
@a[$k+1..$#a]=reverse@a[$k+1..$#a] if $k<$n-2;
}
__END__
#https://en.wikipedia.org/wiki/Permutation#Generation_in_lexicographic_order
# prints e-1 ! 2.718281 - 1
my@a=(1..$n); #bryr seg ikke om elementene saalenge de starter sortert, er unike og sammenlignbare med <
my($i,$s)=(0,0);
while(1){
$i++;
print join(" ", @a)."\n";
my $k=$n-2; 1 while $a[$k]>=$a[$k+1] and $k--; last if $k<0;
my $l=$n-1; 1 while $a[$k]>=$a[$l] and $l-->$k;
@a[$k,$l]=@a[$l,$k];
next if $k == $n-2 and ++$s; #next not needed, but speeds up
$s+=$#a-$k;
@a[$k+1..$#a] = reverse @a[$k+1..$#a] ;
}
print STDERR "avg=".($s/$i)."\n";
( run in 0.468 second using v1.01-cache-2.11-cpan-39bf76dae61 )