-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathH99_prob-28.hs
37 lines (31 loc) · 957 Bytes
/
H99_prob-28.hs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
-- 28 a.
lsort :: [String] -> [String]
lsort [] = []
lsort [x] = [x]
lsort xs = merge (lsort ls) (lsort rs)
where (ls, rs) = halve xs
merge :: [String] -> [String] -> [String]
merge [] ys = ys
merge xs [] = xs
merge (x:xs) (y:ys)
| length x < length y = x : merge xs (y:ys)
| otherwise = y : merge (x:xs) ys
halve :: [a] -> ([a],[a])
halve xs = (take n xs, drop n xs)
where n = length xs `div` 2
-- 28 b.
lfreq :: String -> [String] -> Int
lfreq x as = length ( filter (\y -> length y == length x) as)
lfsort' :: [String] -> [String] -> [String]
lfsort' _ [] = []
lfsort' _ [x] = [x]
lfsort' as xs = mergef as (lfsort' as ls) (lfsort' as rs)
where (ls, rs) = halve xs
mergef ::[String] -> [String] -> [String] -> [String]
mergef as [] ys = ys
mergef as xs [] = xs
mergef as (x:xs) (y:ys)
| lfreq x as < lfreq y as = x : mergef as xs (y:ys)
| otherwise = y : mergef as (x:xs) ys
lfsort :: [String] -> [String]
lfsort xs = lfsort' xs xs