Quest-ce que le tri du sommeil?


Meilleure réponse

Le tri du sommeil est un algorithme de tri des blagues qui est devenu populaire sur le tableau 4chan / prog / [1]. Le pseudocode pour le tri de sommeil est:

procedure printNumber(n)

sleep n seconds

print n

end

for arg in args

run printNumber(arg) in background

end

wait for all processes to finish

Ha-ha! Hilarant .

En dautres termes, ce quil fait, cest que le tri de sommeil engendre un processus pour chaque argument. Chaque processus attend n secondes, puis imprime n, ce qui signifie quil faut 1 seconde pour imprimer « 1 », 2 secondes pour imprimer out « 2 », 100 secondes pour imprimer « 100 ». Cela signifie que pour la plupart, les nombres sont imprimés dans lordre de leur taille, « triant » ainsi les arguments.

La complexité de cet algorithme dans un monde parfait est O(max(args)), car il faudra max(args) secondes pour imprimer le plus grand arg. En réalité, la complexité est O(n^2 + max(args)), car le maintien de plusieurs processus darrière-plan repose sur le système dexploitation pour gérer le changement de contexte et la hiérarchisation des processus, et donc lalgorithme sous-traite essentiellement le tri réel à le noyau.

Notez également quil ny a aucune garantie que la sortie du tri soit réellement correcte, une fonctionnalité que la plupart des autres algorithmes de tri nont pas.

[1] http://dis.4chan.org/read/prog/1295544154

Réponse

Pour le plaisir, il y a une implémentation dans Erlang

sort(L) ->

Parent = self(),

[ spawn\_link(fun() -> receive after X*10 -> Parent ! X end end) || X <- L ],

[ receive X -> X end || \_ <- L ].

Qui peut aussi bien être écrit comme une seule expression dans le shell Erlang

[ receive X -> X end

|| \_ <- [ spawn\_link(fun() -> receive after X*10 -> P ! X end end)

|| P <- [self()], X <- L ] ].

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *