Skip to content

Instantly share code, notes, and snippets.

@BenGoldberg1
Last active August 8, 2016 02:01
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save BenGoldberg1/7a4527bc27f7a75fa403e6d6f4a59677 to your computer and use it in GitHub Desktop.
Save BenGoldberg1/7a4527bc27f7a75fa403e6d6f4a59677 to your computer and use it in GitHub Desktop.
Recursive quickshuffle
sub shuffle( @arr is copy ) {
my sub qshuf ( $first is copy, $cnt is copy ) {
loop {
return if $cnt <= 1;
my ($left, $right) = ($first, $first+$cnt);
SWAPLOOP: loop {
++$left >= $right and last SWAPLOOP while Bool.pick;
--$right <= $left and last SWAPLOOP while Bool.pick;
@arr[$left++, --$right] .= reverse;
last if $left >= $right;
}
my $lsize = $left - $first;
my $rsize = $cnt - $lsize;
if $lsize < $rsize {
qshuf( $first, $lsize );
($first, $cnt) = ( $left, $rsize );
} else {
qshuf( $left, $rsize );
$cnt = $lsize;
}
}
}
qshuf( 0, +@arr );
return @arr;
}
say shuffle( flat ^30 );
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment