我是 Haskell 的新手,我正在尝试在其中实现一些已知的算法。
我已经对字符串实现了合并排序。与 C 和 Java 实现相比,我对 Haskell 实现的性能有点失望。在我的机器(Ubuntu Linux,1.8 GHz)上,C(gcc 4.3.3)在 1.85 秒内对 1 000 000 个字符串进行排序,Java(Java SE 1.6.0_14)在 3.68 秒内排序,Haskell(GHC 6.8.2)在 25.89 秒内排序。对于更大的输入(10 000 000 个字符串),C 需要 21.81 秒,Java 需要 59.68 秒,Haskell 开始交换,我更喜欢在几分钟后停止程序。
由于我是 Haskell 的新手,我很想知道我的实现是否可以提高时间/空间效率。
提前感谢您的任何提示乔治
我的实现:
merge :: [String] -> [String] -> [String]
merge [] ys = ys
merge xs [] = xs
merge (x:xs) (y:ys) = if x < y
then x : (merge xs (y:ys))
else y : (merge (x:xs) ys)
mergeSort :: [String] -> [String]
mergeSort xs = if (l < 2)
then xs
else merge h t
where l = length xs
n = l `div` 2
s = splitAt n xs
h = mergeSort (fst s)
t = mergeSort (snd s)