使用三分之二算法对数组进行排序

时间:2017-09-11 22:35:18

标签: arrays algorithm sorting recursion

我遇到了一种不常见的排序算法。 该算法对数组的前2/3进行排序,然后对数组的下一个2/3进行排序,并再次递归排序数组的前2/3。

fun sort3(a: int list): int list =
  case a of
    nil => nil
  | [x] => [x]
  | [x,y] => [Int.min(x,y), Int.max(x,y)]
  | a => let
      val n = List.length(a)
      val m = (2*n+2) div 3
      val res1 = sort3(List.take(a, m))
      val res2 = sort3(List.drop(res1, n-m) @
                       List.drop(a, m))
      val res3 = sort3(List.take(res1, n-m) @
                       List.take(res2, 2*m-n))
    in
      res3 @ List.drop(res2,2*m-n)
    end

此算法的递归关系写为

T(n) = 2T(n/3) + O(n)

我明白这个算法是如何工作的。

我的理解是, 1.递归调用相同的函数,直到数组大小为3,然后使用bruteforce对数组进行排序。 2.然后使用o(n)时间合并数组(如合并排序)。

我是对的吗?

我不懂它所写的语言,所以我无法理解代码。任何人都可以帮助我理解这个算法。

PS:这不是作业。

0 个答案:

没有答案