Для тех, кто заинтересован, я быстро собрал этот кусочек Ruby, прежде чем читать ответы:
module Enumerable
def counting_sort(k)
reduce(Array.new(k+1, 0)) {|counting, n| counting.tap { counting[n] += 1 }}.
map.with_index {|count, n| [n] * count }.flatten
end
end
ary = Array.new(1_000_000){ rand(100) + 1 }
ary.counting_sort(100) # I'll spare you the output :-)
Я даже не знал, что у него есть имя. Он должен донести эту идею даже до того, кто никогда раньше не видел Ruby. (Единственное, что вам нужно знать, это то, что комбинатор K пишется tap
в Ruby.)
И это действительно чертовски быстро, хотя, к сожалению, я не смог превзойти встроенную оптимизированную вручную O (n & thinsp; log & thinsp; n) сортировку, написанную на C в MRI и YARV и Java в JRuby.