use strict; use warnings; my @original = (1, 2, 3, 4, 5, 6, 7, 8, 3, 5, 6, 3, 8, 1, 7, 8); my @lists = [shift @original]; for my $value (@original) { push @lists, [] if $value < $lists[-1][-1]; push @{$lists[-1]}, $value; } print join (', ', map {"[@$_]"} @lists), "\n"; my @result; while (@lists) { my ($smallest) = sort {$lists[$a][0] <=> $lists[$b][0]} 0 .. $#lists; push @result, shift @{$lists[$smallest]}; @lists = grep{scalar @$_} @lists; } print "@result";