radix_sort.sf 770 B

123456789101112131415161718192021222324252627282930313233
  1. #!/usr/bin/ruby
  2. #
  3. ## https://rosettacode.org/wiki/Sorting_algorithms/Radix_sort
  4. #
  5. class Array {
  6. method radix_sort(base=10) {
  7. var arr = self.clone
  8. var rounds = ([arr.minmax].map{.abs}.max.ilog(base) + 1)
  9. for i in (0..rounds) {
  10. var buckets = (2*base -> of {[]})
  11. var base_i = base**i
  12. for n in arr {
  13. var digit = (n/base_i % base)
  14. digit += base if (0 <= n)
  15. buckets[digit].append(n)
  16. }
  17. arr = buckets.flat
  18. }
  19. return arr
  20. }
  21. }
  22. for arr in [
  23. [1, 3, 8, 9, 0, 0, 8, 7, 1, 6],
  24. [170, 45, 75, 90, 2, 24, 802, 66],
  25. [170, 45, 75, 90, 2, 24, -802, -66],
  26. [100000, -10000, 400, 23, 10000],
  27. ] {
  28. say arr.radix_sort
  29. }