Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
11
Добавлен:
28.06.2014
Размер:
1.17 Кб
Скачать
--2.19. Сортировка. Описать алгоритм сортировки списка методом слияния двух списков (исходный список делится на два, они сортируются, после чего объединяются). Порядок сортировки задаётся функцией типа f :: a -> a -> bool, возвращающей true, если элементы находятся в правильном порядке.

--Сложность n*log(n)
f217 :: [a] -> (a -> a-> Bool) -> [a]
f217 [] _ = []
f217 (x:[]) _ = [x]
f217 xs fun = let (p:q:ps) = (f217_2 xs True [] [])
in (f217_1 (f217 p fun) (f217 q fun) fun)

--Разбиение
--Сложность n
f217_2 [] _ l r = [l, r]
f217_2 (x:xs) f l r = if f then
f217_2 xs (not f) (x:l) r
else
f217_2 xs (not f) l (x:r)

-- Слияние
-- сложность n
f217_1 [] ys _ = ys
f217_1 xs [] _ = xs
f217_1 (x:xs) (y:ys) f = if (f y x) then
y:(f217_1 (x:xs) ys f)
else
x:(f217_1 xs (y:ys) f)

-- пример функции
f a b = a < b
Соседние файлы в папке 2