
Добавил:
Tushkan
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Готовые лабораторные работы / 2 / 219
.hs --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
--Сложность 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