Skip to content

Instantly share code, notes, and snippets.

@Tarmil
Last active August 25, 2016 08:16
Show Gist options
  • Save Tarmil/cc9243a055c213253d5c6f09cdd24d13 to your computer and use it in GitHub Desktop.
Save Tarmil/cc9243a055c213253d5c6f09cdd24d13 to your computer and use it in GitHub Desktop.
module MergeSort
let sortBy cmp xs =
let rec sequences xs =
match xs with
| a :: b :: xs ->
if cmp a b > 0
then descending b [a] xs
else ascending b (fun ys -> a :: ys) xs
| xs -> [xs]
and descending a ``as`` bs =
match bs with
| b :: bs when cmp a b > 0 -> descending b (a :: ``as``) bs
| bs -> (a :: ``as``) :: sequences bs
and ascending a ``as`` bs =
match bs with
| b :: bs when cmp a b <= 0 -> ascending b (fun ys -> ``as`` (a :: ys)) bs
| bs -> ``as`` [a] :: sequences bs
let rec merge ``as`` bs =
match ``as``, bs with
| a :: as', b :: bs' ->
if cmp a b > 0
then b :: merge ``as`` bs'
else a :: merge as' bs
| [], bs -> bs
| ``as``, [] -> ``as``
let rec mergePairs = function
| a :: b :: xs -> merge a b :: mergePairs xs
| xs -> xs
let rec mergeAll = function
| [x] -> x
| xs -> mergeAll (mergePairs xs)
mergeAll (sequences xs)
let sort xs = sortBy compare xs
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment