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 ] ].