# A non-recursive implementation of the Johnson-Trotter permutation algorithm.
#
# The easiest way to understand the code is to stare at the output:
# it's pretty easy to see what's happening, and when you've seen that,
# think about how you'd implement it. You should end up with something
# similar to what's here.
#
# 2001-07-27 robin@cpan.org
use strict;
my @array = (qw'a b c X');
my @p = (0..$#array); # Start at the end...
my @d = (-1) x @array; # ...going left
sub next_perm {
my ($l, $i) = (0, $#p);
while ($i > 0
&& ( ($p[$i] == 0 && $d[$i] < 0)
|| ($p[$i] == $i && $d[$i] > 0)) )
{
++$l if $p[$i] == 0;
$d[$i] = -$d[$i];
-- $i;
}
my $p_l = $p[$i]+$l; my $p_l_d = $p_l + $d[$i];
$p[$i] += $d[$i];
@array[$p_l, $p_l_d] = @array[$p_l_d, $p_l];
}
for(1..25) {
print "@array\n";
next_perm();
}