my @topten = sort_top(10, sub { $a <=> $b }, @huge_array); #### sub sort_top { my($top, $func, @arr) = @_; my @top = sort $func @arr[0..$top-1]; for my $i ($top..$#arr) { my $x = -1; for (my $t = $#top; $t >= 0; $t--) { local ($a, $b) = ($arr[$i], $top[$t]); last if($func->() == 1); $x = $t; } if($x != -1) { splice(@top, $x, 0, $arr[$i]); pop(@top); } } return @top; }