Algorithm-Bitonic-Sort
view release on metacpan or search on metacpan
lib/Algorithm/Bitonic/Sort.pm view on Meta::CPAN
return @_ if int @_ <= 1;
my $single_bit = shift @_ if @_ % 2;
$single_bit //= 'NA';
say Dumper $single_bit if DEBUG;
my @num = @_;
my @first = bitonic_sort( 1, @num[0..(@num /2 -1)] );
my @second = bitonic_sort( 0, @num[(@num /2)..(@num -1)] );
return _bitonic_merge( $up, $single_bit, @first, @second );
}
sub _bitonic_merge {
my $up = shift;
say '#### Merge: '.Dumper(@_) if DEBUG;
my $single_bit = shift;
say Dumper $single_bit if DEBUG;
# assume input @num is bitonic, and sorted list is returned
return @_ if int @_ == 1;
my $single_bit_2 = shift @_ if @_ % 2;
$single_bit_2 //= 'NA';
my @num = @_;
@num = _bitonic_compare( $up, @num );
my @first = _bitonic_merge( $up, 'NA', @num[0..(@num /2 -1)] );
my @second = _bitonic_merge( $up, 'NA', @num[(@num /2)..(@num -1)] );
@num = (@first, @second);
@num = _some_sorting_algorithm( $up, $single_bit, @first, @second ) if $single_bit ne 'NA';
@num = _some_sorting_algorithm( $up, $single_bit_2, @first, @second ) if $single_bit_2 ne 'NA';
say "#####\n# Merge Result\n#####\n".Dumper(@num) if DEBUG;
return (@num);
}
sub _bitonic_compare {
my $up = shift;
say '#### Compare: '.Dumper(@_) if DEBUG;
my @num = @_;
lib/Algorithm/Bitonic/Sort.pm view on Meta::CPAN
my $dist = int @num /2;
#~
for my $i (0..$dist-1) {
say "i=$i, dist=$dist, $num[$i] > $num[$i+$dist]) == $up" if DEBUG;
if ( ($num[$i] > $num[$i+$dist]) == $up ) {
say "Swapping....." if DEBUG;
($num[$i], $num[$i+$dist]) = ($num[$i+$dist], $num[$i]); #swap
}
}
#~ for my $i (0..(int @$first)) {
#~ if ( ($first->[$i] > $second->[$i]) == $up ) {
#~ ($first->[$i], $second->[$i]) = ($second->[$i], $first->[$i]); #swap
#~ }
#~ }
say 'Compared result:'.Dumper(@num) if DEBUG;
return @num;
#~ return ($first, $second);
}
sub _some_sorting_algorithm {
my $up = shift;
my $single_bit = shift;
my @num = @_;
my @num_new;
say "_SOME_SORTING_ALGORITHM: INPUT: ".Dumper(@num) if DEBUG;
( run in 1.107 second using v1.01-cache-2.11-cpan-39bf76dae61 )