クイックソートとマージソート書いてみた
Haskellの書き方がよくわからないので,入門サイトを見てクイックソートを書き写してみる.
qsort [] = [] qsort (x:xs) = qsort [y | y <- xs, y < x] ++ [x] ++ qsort [y | y <- xs, y >= x] main = print (qsort [3, 1, 4, 1, 5, 9, 2, 6])
うーん.
マージソートくらいなら書けそうな気がしてきたので,試行錯誤しながら自力で書いてみる.
split list = let len = div (length list) 2 in (take len list, drop len list) mergesort [] = [] mergesort [x] = [x] mergesort list = case split list of (xs,ys) -> merge (mergesort xs) (mergesort ys) merge [] [] = [] merge [] yys = yys merge xxs [] = xxs merge xxs@(x:xs) yys@(y:ys) | x < y = x:merge xs yys | otherwise = y:merge xxs ys main = print (mergesort [3, 1, 4, 1, 5, 9, 2, 6])
できたっぽい.
パターンマッチとか,OCamlと似たようなノリで書いてるけどなんとかなるのかな.
これまたOCamlと同じで,はてなの色付けが地味だなぁ.