merge_sort.sf 595 B

12345678910111213141516171819202122232425262728293031323334
  1. #!/usr/bin/ruby
  2. #
  3. ## https://rosettacode.org/wiki/Sorting_algorithms/Merge_sort
  4. #
  5. func merge(left, right) {
  6. var result = []
  7. while (left && right) {
  8. result << [right,left].min_by{.first}.shift
  9. }
  10. result + left + right
  11. }
  12.  
  13. func mergesort(array) {
  14. var len = array.len
  15. len < 2 && return array
  16.  
  17. var (left, right) = array.part(len//2)
  18.  
  19. left = __FUNC__(left)
  20. right = __FUNC__(right)
  21.  
  22. merge(left, right)
  23. }
  24.  
  25. # Numeric sort
  26. var nums = rand(1..100, 10)
  27. say mergesort(nums)
  28.  
  29. # String sort
  30. var strings = rand('a'..'z', 10)
  31. say mergesort(strings)