SHOW:
|
|
- or go back to the newest paste.
| 1 | #!/usr/bin/env perl | |
| 2 | ||
| 3 | use 5.014; | |
| 4 | use warnings; | |
| 5 | use strict; | |
| 6 | use autodie; | |
| 7 | ||
| 8 | my @unsorted = map { int(rand(100)) } 1..20;
| |
| 9 | say join ' ', @unsorted; | |
| 10 | ||
| 11 | sub mergesort {
| |
| 12 | my @items = @_; | |
| 13 | if (@items <= 1) { @items }
| |
| 14 | else { merge([mergesort(splice @items, 0, ($#items+1)/2)],[mergesort(@items)]) }
| |
| 15 | } | |
| 16 | ||
| 17 | sub merge {
| |
| 18 | my @l1 = @{shift @_};
| |
| 19 | my @l2 = @{shift @_};
| |
| 20 | if (!@l2) { @l1 }
| |
| 21 | - | if (!@l2) { @l1; }
|
| 21 | + | elsif (!@l1) { @l2 }
|
| 22 | - | elsif (!@l1) { @l2; }
|
| 22 | + | |
| 23 | my ($a,$b) = (shift @l1,shift @l2); | |
| 24 | - | my ($a,$b) = (shift @l1, shift @l2); |
| 24 | + | $a < $b ? ($a,merge([@l1],[$b,@l2])) : ($b,merge([$a,@l1],[@l2])); |
| 25 | - | $a < $b ? ($a, merge([@l1], [$b,@l2])) : ($b, merge([$a,@l1], [@l2])); |
| 25 | + | |
| 26 | } | |
| 27 | ||
| 28 | my @sorted = mergesort(@unsorted); | |
| 29 | say join ' ', @sorted; |