Advertisement
robn

mergesort

Mar 12th, 2012
120
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  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.     elsif (!@l1) { @l2 }
  22.     else {
  23.         my ($a,$b) = (shift @l1,shift @l2);
  24.         $a < $b ? ($a,merge([@l1],[$b,@l2])) : ($b,merge([$a,@l1],[@l2]));
  25.     }
  26. }
  27.  
  28. my @sorted = mergesort(@unsorted);
  29. say join ' ', @sorted;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement