Быстрая сортировка целых чисел в Haskell

Есть ли в библиотеках 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 минут работы) -time)

Я предполагаю, что более быстрые алгоритмы также обеспечат печать памяти игрока, поэтому ищем время 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
5
задан Karan 10 April 2012 в 17:29
поделиться