Zrobiłem kilka analiz algorytmów sortowania w F # kilka lat temu w bardzo imperatywnym stylu; Próbowałem pobić wdrożenie platformy .NET i udało mi się to zrobić here. Postąpiłem dzisiaj, aby odpowiedzieć sobie na pytanie, ale FPish nie pozwoli mi założyć konta. Argh! Muszę zrobić gdzieś mój posterunek, a tutaj jest tak dobrze, jak wszędzie, lol ...
Podczas czytania "Learn You a Haskell For Great Good" wczoraj, autor ustanowił przykład wdrożenia quicksort. Opis był dość jasny i zanim dotarłem do przykładowego kodu, w mojej głowie pojawił się elegancki, rekursywny roztwór (w Haskell). Chyba nigdy nie miałem intuicyjnego wyczucia tego, jak działa quicksort, ponieważ trywialne rozwiązanie jest dość łatwe, jeśli nie bardzo wydajne.
Oto moja wersja w 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 ]
A, odpowiednik Haskell (mi się podoba ... czyste!)
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 ]
Na grins tu inna wersja # C (przeważnie ogon rekurencyjne), który znajduje się około 2 x prędkość wersji trywialne. Nie przeszkadzało do czasu tego przeciwko mojego oryginalnego postu, choć, więc nie wiem jak to stosy aż do wersji zmienny w moim OP na FPish.net (FSHub) od kilku lat temu ...
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 , to nie jest * quicksort. W szczególności, kiedy ostatni raz testowałem ten Haskella, było to 6000 razy wolniejsze niż prawdziwe quicksort napisane w F #. Aby uzyskać informacje na temat prawdziwego algorytmu quicksort (a nie wersji spartycjonowanej Haskella, która całkowicie pomija cały punkt bycia szybkim!), Przeczytaj oryginalny artykuł Hoare'a z 1961 roku: http://comjnl.oxfordjournals.org/cgi/content/short/5/1/10 –