Für alle Interessierten, warf ich schnell zusammen, um dieses Stück von Ruby, bevor die Antworten zu lesen:
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 :-)
ich nicht einmal wusste, dass es einen Namen hatte. Es sollte die Idee sogar jemandem vermitteln, der Ruby noch nie zuvor gesehen hat. (Das Einzige, was Sie wissen müssen, ist, dass der K-Kombinator in Ruby tap
geschrieben wird.)
Und es ist wirklich verdammt schnell, obwohl ich leider nicht in der Lage gewesen bin, die eingebaute Hand-optimierte O (n & thinsp; log & thinsp; n) sort, das in C in MRI und YARV und Java in JRuby geschrieben ist.
Es ist nicht möglich, in der Regel ist eine Liste in O (n) zu sortieren, auch wenn jede Nummer in der Liste kleiner als 100 ist. – SLaks
@SLaks: Das Minimum von O (N lgN) gilt nur für Sortierungen, die auf Vergleichen basieren. –
in diesem Fall können Sie, indem Sie einfach Elemente zwischen 1 und 100 zählen. –