От: | Буравчик | ||
Дата: | 15.05.09 21:46 | ||
Оценка: |
qsort [] = []
qsort xs = qsort lesser ++ equals ++ qsort greater
where (lesser,equals,greater) = split mean xs
mean = xs !! (length xs `div` 2)
-- делит список xs на три части, возвращает тупл (элементы меньшие mean, равные mean, большие mean)
split mean xs = split' [] [] [] xs
where split' ls es gs [] = (ls,es,gs)
split' ls es gs (p:ps) | p < mean = split' (p:ls) es gs ps
| p == mean = split' ls (p:es) gs ps
| p > mean = split' ls es (p:gs) ps
От: | z00n | ||
Дата: | 15.05.09 21:54 | ||
Оценка: | 3 (1) |
qsort3 :: Ord a => [a] -> [a]
qsort3 x = qsort3' x []
qsort3' [] y = y -- +++
qsort3' [x] y = x:y -- +++
qsort3' (x:xs) y = part xs [] [x] []
where
part [] l e g = qsort3' l (e ++ (qsort3' g y))
part (z:zs) l e g
| z > x = part zs l e (z:g)
| z < x = part zs (z:l) e g
| otherwise = part zs l (z:e) g
От: | Rtveliashvili Denys | ||
Дата: | 16.05.09 10:37 | ||
Оценка: |
Z>qsort3 :: Ord a => [a] -> [a]
Z>qsort3 x = qsort3' x []
Z>qsort3' [] y = y -- +++
Z>qsort3' [x] y = x:y -- +++
Z>qsort3' (x:xs) y = part xs [] [x] []
Z> where
Z> part [] l e g = qsort3' l (e ++ (qsort3' g y))
Z> part (z:zs) l e g
Z> | z > x = part zs l e (z:g)
Z> | z < x = part zs (z:l) e g
Z> | otherwise = part zs l (z:e) g
Z>
От: | Gaperton | http://gaperton.livejournal.com | |
Дата: | 16.05.09 11:32 | ||
Оценка: |
От: | Gaperton | http://gaperton.livejournal.com | |
Дата: | 16.05.09 11:49 | ||
Оценка: |
От: | Rtveliashvili Denys | ||
Дата: | 16.05.09 13:55 | ||
Оценка: |
От: | Gaperton | http://gaperton.livejournal.com | |
Дата: | 16.05.09 15:02 | ||
Оценка: |
От: | Буравчик | ||
Дата: | 17.05.09 11:10 | ||
Оценка: | 30 (2) |
-- Вариант 0 (quick sort "в лоб")
qsort0 [] = []
qsort0 (x:xs) = qsort0 (filter (<x) xs) ++ [x] ++ qsort0 (filter (>=x) xs)
-- Вариант 1 (мой вариант) - один проход по списку
-- сортировка относительно середины списка
qsort2 [] = []
qsort2 xs = qsort2 lesser ++ equals ++ qsort2 greater
where (lesser,equals,greater) = split mean xs
mean = xs !! (length xs `div` 2)
split mean xs = split' [] [] [] xs
where split' ls es gs [] = (ls,es,gs)
split' ls es gs (p:ps) | p < mean = split' (p:ls) es gs ps
| p == mean = split' ls (p:es) gs ps
| p > mean = split' ls es (p:gs) ps
-- Вариант 1 (dmz / z00n)
qsort3 x = qsort3' x []
qsort3' [] y = y
qsort3' [x] y = x:y
qsort3' (x:xs) y = part xs [] [x] []
where
part [] l e g = qsort3' l (e ++ (qsort3' g y))
part (z:zs) l e g
| z > x = part zs l e (z:g)
| z < x = part zs (z:l) e g
| otherwise = part zs l (z:e) g
Время / память для 100 тыс. элементов Время / память для 1 млн. элементов |
Сортируемый список --> Алгоритм сортировки | Случайные значения | Отсортированные значения | В обратном порядке |
Вариант 0 ("простая программа" на Haskell) | 1.06 sec / 10 Mb 103.77 sec / 92 Mb | 480.72 sec / 7 Mb * Более 600 sec * | * out of memory * * out of memory * |
Вариант 1 (мой) | 0.17 sec / 12 Mb 1.86 sec / 122 Mb | 0.17 sec / 6 Mb 2.08 sec / 56 Mb | 0.16 sec / 6 Mb 2.03 sec / 56 Mb |
Вариант 2 (dmz / z00n) | 0.08 sec / 6 Mb 1.08 sec / 57 Mb | 258.28 sec / 7 Mb * Более 600 sec * | 259.47 sec / 7 Mb * Более 600 sec * |
Sort из стандартной библиотеки (merge sort) | 0.34 sec / 17 Mb 5.67 sec / 150 Mb | 0.13 sec / 9 Mb 1.64 sec / 75 Mb | 0.16 sec / 12 Mb 1.83 sec / 121 Mb |
От: | thesz | http://thesz.livejournal.com | |
Дата: | 17.05.09 11:28 | ||
Оценка: |
От: | Буравчик | ||
Дата: | 17.05.09 15:23 | ||
Оценка: | 21 (2) |
rnds seed = randomRs (1,1000000) (mkStdGen seed) :: [Int]
list = take n $ rnds seed
Count --> Algorithm | 200'000 | 400'000 | 800'000 | 1'600'000 | 3'200'000 |
sort ( mergesort from Data.List) | 2.16s secs / 76 Mb 2.17s secs / 76 Mb 2.16s secs / 76 Mb 2.17s secs / 76 Mb 2.14s secs / 76 Mb | 5.95s secs / 152 Mb 5.97s secs / 152 Mb 6.00s secs / 152 Mb 6.00s secs / 152 Mb 5.92s secs / 152 Mb | 18.13s secs / 298 Mb 18.09s secs / 298 Mb 18.14s secs / 298 Mb 18.05s secs / 298 Mb 18.03s secs / 298 Mb | 59.30s secs / 596 Mb 59.45s secs / 596 Mb 59.55s secs / 596 Mb 59.47s secs / 596 Mb 59.42s secs / 596 Mb | 209.13s secs / 1193 Mb 209.42s secs / 1193 Mb 208.73s secs / 1193 Mb 209.22s secs / 1193 Mb 209.16s secs / 1193 Mb |
qsort ( quick sort original) | 0.75s secs / 21 Mb 0.73s secs / 22 Mb 0.70s secs / 18 Mb 0.70s secs / 18 Mb 0.75s secs / 21 Mb | 1.66s secs / 41 Mb 1.59s secs / 43 Mb 1.52s secs / 37 Mb 1.58s secs / 37 Mb 1.56s secs / 41 Mb | 3.64s secs / 86 Mb 3.55s secs / 86 Mb 3.33s secs / 73 Mb 3.39s secs / 75 Mb 3.39s secs / 81 Mb | 7.98s secs / 166 Mb 7.67s secs / 172 Mb 7.31s secs / 149 Mb 7.48s secs / 146 Mb 7.47s secs / 163 Mb | 17.88s secs / 342 Mb 17.22s secs / 343 Mb 16.45s secs / 292 Mb 16.83s secs / 284 Mb 16.94s secs / 328 Mb |
qsort2 ( quick sort Buravchik) | 0.94s secs / 44 Mb 0.98s secs / 44 Mb 0.97s secs / 44 Mb 0.95s secs / 43 Mb 0.97s secs / 43 Mb | 2.48s secs / 83 Mb 2.48s secs / 83 Mb 2.45s secs / 83 Mb 2.36s secs / 83 Mb 2.48s secs / 83 Mb | 6.92s secs / 165 Mb 6.88s secs / 165 Mb 6.70s secs / 165 Mb 6.64s secs / 165 Mb 6.70s secs / 165 Mb | 20.56s secs / 329 Mb 20.38s secs / 329 Mb 20.41s secs / 329 Mb 20.69s secs / 329 Mb 20.89s secs / 329 Mb | 68.50s secs / 657 Mb 69.56s secs / 657 Mb 68.91s secs / 657 Mb 69.19s secs / 657 Mb 68.84s secs / 657 Mb |
qsort3 ( quick sort dmz / z00n) | 0.33s secs / 10 Mb 0.34s secs / 11 Mb 0.34s secs / 10 Mb 0.33s secs / 11 Mb 0.34s secs / 10 Mb | 0.75s secs / 22 Mb 0.73s secs / 22 Mb 0.73s secs / 22 Mb 0.75s secs / 23 Mb 0.72s secs / 22 Mb | 1.58s secs / 43 Mb 1.69s secs / 45 Mb 1.63s secs / 45 Mb 1.56s secs / 46 Mb 1.64s secs / 45 Mb | 3.72s secs / 91 Mb 3.67s secs / 90 Mb 3.70s secs / 93 Mb 3.70s secs / 91 Mb 3.63s secs / 93 Mb | 8.44s secs / 181 Mb 8.73s secs / 185 Mb 8.05s secs / 182 Mb 8.25s secs / 182 Mb 8.09s secs / 184 Mb |
От: | D. Mon | http://thedeemon.livejournal.com | |
Дата: | 17.05.09 18:28 | ||
Оценка: |
От: | Буравчик | ||
Дата: | 17.05.09 19:05 | ||
Оценка: |