私は数行で挿入ソートとクイックソートを実装することができましたが、選択ソートとマージソートは依然として頭痛の種です;)
selectionsort [] = []
selectionsort (x:xs) =
let (minimum, greater) = extractMinimum x [] xs
in minimum : selectionsort greater
extractMinimum minimumSoFar greater [] = (minimumSoFar, greater)
extractMinimum minimumSoFar greater (x:xs)
| x < minimumSoFar = extractMinimum x (minimumSoFar:greater) xs
| otherwise = extractMinimum minimumSoFar (x:greater) xs
extractMinimum
標準ライブラリで利用できる関数のようなものはありますか? (a -> a -> Bool/Ordering) -> [a] -> (a, [a])
運がないのでフーグリングしてみました。
mergesort [ ] = [ ]
mergesort [x] = [x]
mergesort xs =
let (left, right) = splitAt (length xs `div` 2) xs
in merge (mergesort left) (mergesort right)
merge xs [] = xs
merge [] ys = ys
merge xxs@(x:xs) yys@(y:ys)
| x < y = x : merge xs yys
| otherwise = y : merge xxs ys
繰り返しますが、merge
自分で作成する必要がありますか? それとも既存のコンポーネントを再利用できますか? Hoogle は について有用な結果をくれませんでした(a -> a -> Bool/Ordering) -> [a] -> [a] -> [a]
。