6

我正在为合并排序(Haskell)编写代码。

我对根据顺序将两个列表放在一起的功能有疑问。

(即 [1,4,7] [2,5,6] -> [1,2,4,5,6,7])

这是我的原始代码。(xs, ys 是参数,zs 是累加器。)

msort4 [] ys zs = zs ++ ys
msort4 xs [] zs = zs ++ xs
msort4 allx@(x:xs) ally@(y:ys) zs 
 | x <= y = msort4 xs ally (zs ++ [x])
 | otherwise = msort4 allx ys (zs ++ [y])

这是我在参考网上找到的代码后编写的第二个代码。

msort4 [] ys = ys
msort4 xs [] = xs
msort4 allx@(x:xs) ally@(y:ys)
 | x <= y = x :msort4 xs ally 
 | otherwise = y :  msort4 allx ys

只是有了这个小小的区别,我的代码改进了很多。

我正在对大约 500 个单词的列表进行排序,我的原始代码需要大约 2.5 秒,但新代码的排序平均在 0.4 秒内。

我想知道为什么我的速度这么慢,而在线的速度要快得多,尽管它们看起来很相似。(我什至认为我的会更快,因为我的不需要来回走动。)

提前致谢。

4

1 回答 1

6

在列表前添加 (:) 是 O(1),(++) 是 O(n),其中 n 是左列表的长度

随着 zs 变大,您每次都必须遍历整个列表才能添加一个元素 [x]

于 2013-04-16T23:58:29.723 回答