Discipulus => sub{ my @list = @input; my @neg = sort {$a<=>$b} grep { $_ < 0 } @list; my @pos = sort {$a<=>$b} grep { $_ >= 0} @list; @list = (@pos,@neg); Compare(\@list,\@output) or die "@list" if DO_CHECK; }, Discipulus2 => sub{ my @list = sort {$a<=>$b} @input; push @list, shift @list until $list[0] >= 0; Compare(\@list,\@output) or die "@list" if DO_CHECK; }, #### Discipulus3 => sub{ my @list = sort { (( $a >= 0 and $b >= 0) or ($a < 0 and $b < 0 )) ? $a<=>$b : $b<=>$a } @input; Compare(\@list,\@output) or die "@list" if DO_CHECK; }, #OUTPUT Rate Discipulus Discipulus3 Discipulus2 Discipulus 46252/s -- -14% -46% Discipulus3 53805/s 16% -- -38% Discipulus2 86380/s 87% 61% --