OCaml習作: マージソート
できた。
arrayでデータを受け取ってlistで返すという謎仕様なのは、データの列を分割するのはarrayのほうが簡単で、分割してソートした結果を組み立てていくのはlistのほうが簡単だったから。
open Array open List let rec mysort comp arr = match arr with [||] -> [] | [|x|] -> [x] | [|x; y|] -> if (comp x y) then [x; y] else [y; x] | arr -> let len = Array.length arr in let head = mysort comp (sub arr 0 (len / 2)) in let tail = mysort comp (sub arr (len / 2) (len - (len / 2))) in let rec merge_result ret ls1 ls2 = match ls1, ls2 with [], ls2 -> append (rev ret) ls2 | ls1, [] -> append (rev ret) ls1 | e1 :: es1, e2 :: es2 -> if (comp e1 e2) then merge_result (e1 :: ret) es1 ls2 else merge_result (e2 :: ret) ls1 es2 in merge_result [] head tail;;