【发布时间】:2015-03-11 16:43:20
【问题描述】:
我在网上的任何地方都找不到我的代码,所以你能告诉我为什么或为什么函数 myMergeSort 不是合并排序吗?我知道我的函数 myMergeSort 排序,但不确定它是否真的使用合并排序算法进行排序,或者它是否是不同的算法。几天前我刚开始使用 Haskell。
merge xs [] = xs
merge [] ys = ys
merge (x : xs) (y : ys)
| x <= y = x : merge xs (y : ys)
| otherwise = y : merge (x : xs) ys
myMergeSort :: [Int] -> [Int]
myMergeSort [] = []
myMergeSort (x:[]) = [x]
myMergeSort (x:xs) = foldl merge [] (map (\x -> [x]) (x:xs))
我对 merge 功能没有任何疑问。
以下函数 mergeSortOfficial 是提供给我们的解决方案,我理解它,但不确定我是否在我的函数 myMergeSort 中正确实现了归并排序算法。
官方解决方案-实施:
mergeSortOfficial [] = []
mergeSortOfficial (x : []) = [x]
mergeSortOfficial xs = merge
(mergeSortOfficial (take ((length xs) ‘div‘ 2) xs))
(mergeSortOfficial (drop ((length xs) ‘div‘ 2) xs))
【问题讨论】:
-
不管
mergeSortOfficial是否确实实现了 MergeSort,令我印象深刻的是它在每次调用时都会重新计算列表的长度(两次!)。那是非常低效的;长度应该在开始时一劳永逸地计算。 -
这不属于codereview吗?
-
合并排序将输入分成两个相等(或几乎相等)的部分。这个很重要。你总是与一个元素列表“合并”。这没有所需的渐近复杂度。
-
@MrBones 不是真的。对于“工作”的某些定义,此代码不起作用,所以问题属于这里。
-
我相信这是变相的插入排序:合并以
merge list [x]的形式完成,相当于将x插入到有序的list中。当前代码看起来 O(n^2)。
标签: algorithm sorting haskell functional-programming mergesort