35 lines
770 B
Ruby
35 lines
770 B
Ruby
|
# Least-significant-digit first string sort of fixed-length ASCII strings,
|
||
|
# linear-time sort in typical cases.
|
||
|
# See examples in test/lsd_test.rb
|
||
|
module LSD
|
||
|
RADIX = 256
|
||
|
|
||
|
def self.sort(strings, length)
|
||
|
(length - 1).downto(0).each do |i|
|
||
|
counts = Array.new(RADIX + 1, 0)
|
||
|
|
||
|
# compute frequency counts
|
||
|
strings.each do |string|
|
||
|
ch = string[i].ord
|
||
|
counts[ch + 1] += 1
|
||
|
end
|
||
|
|
||
|
# transform counts into indices
|
||
|
(1..RADIX).each { |r| counts[r] += counts[r - 1] }
|
||
|
|
||
|
# distribute it
|
||
|
aux = Array.new(strings.length)
|
||
|
strings.each do |string|
|
||
|
ch = string[i].ord
|
||
|
aux[counts[ch]] = string
|
||
|
counts[ch] += 1
|
||
|
end
|
||
|
|
||
|
# and copy back
|
||
|
strings = aux
|
||
|
end
|
||
|
|
||
|
strings
|
||
|
end
|
||
|
end
|