Merge 理解ML中的合并排序

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

我有一个任务要把下面的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;

halve
通过将列表中的元素交替添加到两个列表中,将列表一分为二(这样您就不必先计算长度,然后再将其拆分,这将需要1.5次列表遍历,而不仅仅是一次)

merge
按降序合并两个列表


mergeSort
将列表一分为二,对两半进行排序,然后合并已排序的子列表。

halve
merge
几乎是合并排序算法的基础。查看算法而不是代码是有意义的,因为这是SML和Java实现之间的共同点。