sorting - 在 Haskell 中解释这个 'Merge' 函数

标签 sorting haskell mergesort

我正在学习 Haskell,但无法理解此功能。我正在实现合并排序。我实现了合并排序递归函数,但我不明白这个“合并”函数在做什么。我理解命令式语言中的合并排序,但我不理解这里的语法。

merge []         ys                   = ys
merge xs         []                   = xs
merge xs@(x:xt) ys@(y:yt) | x <= y    = x : merge xt ys
                          | otherwise = y : merge xs yt

最佳答案

merge []         ys                   = ys

如果第一个参数为空,则给出第二个参数。
merge xs         []                   = xs

如果第二个参数为空,则给出第一个参数。
merge xs@(x:xt) ys@(y:yt) | x <= y    = x : merge xt ys
                          | otherwise = y : merge xs yt

如果 x小于或等于 y , cons (添加到前面) x 到合并 xs 其余部分的结果(即 xt )和 ys .否则 y更小,因此将其与 xs 与 ys 的其余部分合并的结果相结合(即 yt )。
xs@(x:xt)是使用“占位符”的参数解构。结果是 xs将引用整个第一个参数,而 x是头和xt是尾部。

由于合并是递归定义的,它将继续从 xs 和 ys 中提取元素,直到至少有一个为空,然后简单地返回它。

条 (|) 表示 "guards" ,它可以让您以简洁明了的方式定义条件。

关于sorting - 在 Haskell 中解释这个 'Merge' 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20499129/

相关文章:

c++ - 当我在并行合并排序中增加 vector 的大小时出现段错误

c++ - 尝试使用比较运算符对对象 vector 进行排序

haskell - 如何每秒强制评估 X 次?

haskell - GHC 编译时崩溃

haskell - GHC Haskell 中的类型抽象

c++ - 让合并排序在链表上工作?

algorithm - 为什么合并排序的最坏情况运行时间为 O (n log n)?

java - 特定项目字段列表的比较器

sorting - 如何按顺序打印LUA表?

c# - 在 C# 中对包含子项的列表进行排序