Есть ли какая-либо функция в библиотеках haskell, которая сортирует целые числа за O (n) времени ?? [Под O (n) я подразумеваю быстрее, чем сортировка сравнения и специфическая для целых чисел]
В основном я считаю, что следующий код занимает много времени для сортировки (по сравнению с суммированием списка без сортировки):
import System.Random
import Control.DeepSeq
import Data.List (sort)
genlist gen = id $!! sort $!! take (2^22) ((randoms gen)::[Int])
main = do
gen <- newStdGen
putStrLn $ show $ sum $ genlist gen
Для суммирования списка не требуется deepseq, но то, что я пытаюсь сделать, делает, но приведенный выше код достаточно хорош для указателей, которые я ищу.
Время: 6 секунд (без сортировки); около 35 секунд (с сортировкой)
Память: около 80 МБ (без сортировки); около 310 МБ (с сортировкой)
Примечание 1: здесь для меня проблема больше, чем время, так как для текущей задачи у меня возникают ошибки памяти (использование памяти становится 3 ГБ! После 30 минут работы)
Я предполагаю, что более быстрые алгоритмы также будут обеспечивать печать из памяти Bettor, поэтому ищем время O (n).
Примечание 2: Я ищу быстрые алгоритмы для Int64, хотя быстрые алгоритмы для других конкретных типов также будут полезны.
Используемое решение: IntroSort с распакованными векторами было достаточно для моей задачи:
import qualified Data.Vector.Unboxed as V
import qualified Data.Vector.Algorithms.Intro as I
sort :: [Int] -> [Int]
sort = V.toList . V.modify I.sort . V.fromList