Merge 理解ML中的合并排序
我有一个任务要把下面的ML代码翻译成Java,但我不知道它在做什么。“减半”和“合并”函数在这里做什么Merge 理解ML中的合并排序,merge,functional-programming,sml,mergesort,Merge,Functional Programming,Sml,Mergesort,我有一个任务要把下面的ML代码翻译成Java,但我不知道它在做什么。“减半”和“合并”函数在这里做什么 fun halve nil = (nil, nil) | halve [a] = ([a], nil) | halve (a :: b :: cs) = let val (x, y) = halve cs in (a :: x, b :: y) end; fun merge (nil, ys) = ys | me
fun halve nil = (nil, nil)
| halve [a] = ([a], nil)
| halve (a :: b :: cs) =
let
val (x, y) = halve cs
in
(a :: x, b :: y)
end;
fun merge (nil, ys) = ys
| merge (xs, nil) = xs
| merge (x :: xs, y :: ys) =
if (x > y) then x :: merge(xs, y :: ys)
else y :: merge(x :: xs, ys);
fun mergeSort nil = nil
| mergeSort [a] = [a]
| mergeSort theList =
let
val (x, y) = halve theList
in
print("xList: "^printList(x));
print("yList: "^printList(y));
merge(mergeSort x, mergeSort y)
end;
halve
通过将列表中的元素交替添加到两个列表中,将列表一分为二(这样您就不必先计算长度,然后再将其拆分,这将需要1.5次列表遍历,而不仅仅是一次)
merge
按降序合并两个列表
mergeSort
将列表一分为二,对两半进行排序,然后合并已排序的子列表。halve
和merge
几乎是合并排序算法的基础。查看算法而不是代码是有意义的,因为这是SML和Java实现之间的共同点。