理解ML中的合并排序

时间:2014-09-15 02:11:09

标签: 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
|   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;

1 个答案:

答案 0 :(得分:1)

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

merge按递减顺序合并两个列表。

mergeSort将列表分成两部分,对两部分进行排序,然后合并已排序的子列表。