实现原理

先进行两两排序(将每个元素想象成大小为1的数组),再四四归并… 直到最后。

效率分析

时间复杂度依然是Nlog,只不过不需要递归减少压栈的操作。

代码实现

  1. func sort(a []int) {
  2. aux = make([]int, len(a))
  3. N := len(a)
  4. for sz := 1; sz < N; sz = sz + sz {
  5. for lo := 0; lo < N - sz; lo += sz {
  6. merge(a, lo, lo + sz - 1, min(lo + sz + sz -1, N - 1))
  7. }
  8. }
  9. }