Another update to handle lists where all values are >= 0 (as flagged in 1229492). Also using the while loop instead of List::MoreUtils::firstidx based on the benchmarks in that post.
EDIT - added check for upper bound being >=0, borrowing from code in 1229437.
swl3 => sub {
my @list = @input;
use List::MoreUtils 0.428;
@list = sort {$a<=>$b} @list;
if ($list[0] < 0 && $list[-1] >= 0) {
my $i = List::MoreUtils::bsearchidx {$_ <=> 0} @list;
if ($i < 0) { # no zero, find first positive
$i = 0; $i++ while ($list[$i]<0);
}
else { # find start of zeroes
$i-- while !$list[$i];
$i++;
}
push @list, splice @list, 0, $i;
}
Compare(\@list,\@output) or die "@list" if DO_CHECK;
},