He hecho algunos análisis de algoritmos de clasificación en F # hace unos años en un estilo muy imperativo; Intentaba vencer a la implementación de stock de .NET y logré hacerlo al here. Fui a hacer la siguiente respuesta a mí mismo hoy, pero FPish no me deja crear una cuenta. Argh! Tengo que hacer mi publicación en alguna parte, y aquí está tan bien como en cualquier lugar, lol ...
Mientras leía "Aprende Haskell para un gran bien" ayer, el autor creó un ejemplo para implementar quicksort. La descripción fue bastante clara e incluso antes de llegar al código de muestra, una elegante solución recursiva (en Haskell) apareció en mi cabeza. Supongo que nunca había tenido una idea intuitiva de cómo Quicksort hace su trabajo, porque la solución trivial es bastante fácil, si no muy eficiente.
Aquí está mi versión de F #:
let rec quicksort = function
| [] -> []
| pivot :: xs ->
(left pivot xs) @ pivot :: (right pivot xs)
and left pivot xs = quicksort [ for x in xs do if x <= pivot then yield x ]
and right pivot xs = quicksort [ for x in xs do if x > pivot then yield x ]
Y, el equivalente Haskell (me gusta este ... limpio!):
quicksort :: Ord a => [a] -> [a]
quicksort [] = []
quicksort (pivot : xs) =
left ++ pivot : right
where
left = quicksort [ x | x <- xs, x <= pivot ]
right = quicksort [ x | x <- xs, x > pivot ]
para las muecas, aquí es otra versión # F (en su mayoría recursiva de cola) que se trata de la velocidad 2x de la versión trivial. No se han molestado en este momento contra mi post original, sin embargo, así que ni idea cómo se acumula hasta la versión mutable en mi OP en FPish.net (FSHub) desde hace unos años ...
let rec quicksort' xs =
let rec aux pivot left right = function
| [] -> (quicksort' left) @ pivot :: (quicksort' right)
| x :: xs ->
if x <= pivot then
aux pivot (x :: left) right xs
else
aux pivot left (x::right) xs
match xs with
| [] -> []
| x :: xs -> aux x [] [] xs
Fwiw , esto es * no * quicksort. En particular, la última vez que hice una evaluación comparativa de Haskell fue 6.000 veces más lenta que una secuencia rápida real escrita en F #. Para obtener información sobre el algoritmo de quicksort real (¡y no sobre la versión bastarda de las comunidades de Haskell que no entiende el objetivo de ser rápido!), Lea el artículo original de Hoare de 1961: http://comjnl.oxfordjournals.org/cgi/content/short/5/1/10 –