我有一个将以下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
| 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;
答案 0 :(得分:1)
halve
通过将其元素交替添加到两个列表中将列表拆分为两个(这样可以使您不必先计算长度,然后然后拆分它,这将需要1.5次遍历列表而不是一个)。
merge
按递减顺序合并两个列表。
mergeSort
将列表分成两部分,对两部分进行排序,然后合并已排序的子列表。