我遇到了一种不常见的排序算法。 该算法对数组的前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:这不是作业。