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"; #### [1 2 3 4 5 6 7 8], [3 5 6], [3 8], [1 7 8] 1 1 2 3 3 3 4 5 5 6 6 7 7 8 8 8