合并排序大小不是2 ^ n的数组

时间:2017-12-05 03:36:02

标签: sorting mergesort

在我发现的每个合并排序示例中,算法在大小为8或其他2的幂的数组上演示。这使得它更容易演示,但没有解释如何在不同的数组上使用它大小。你应该如何拆分子阵列?

1 个答案:

答案 0 :(得分:0)

我认为你正在过度思考这个问题。在mergesort的经典版本中,您继续打破输入,直到您有单元素子集合(按定义排序),然后开始将子集合合并在一起。将集合分解为单元素集合主要是分配内存/创建集合对象并在每个集合中粘贴一个元素。

基本的合并排序功能实际上并没有做很多事情。我的Clojure(Lisp变体)mergesort的实现看起来像:

(defn merge-sort [compare-func col]
  (merge-runs compare-func (find-runs-of-3 compare-func col)))

换句话说,输入集合col被分解为三个元素的子集合并进行排序,然后合并这三个元素子集合以获得最终输出。如果输入集合不是三个元素的精确倍数,那就没关系 - 它只是意味着将有一个“剩余”的1或2个元素的子集合与其他所有元素进行排序/合并。

(关于“为什么是三个集合” - 效率。首先,将集合分解为1个集合需要比将其分解为3个集合要多三倍。然后,同样,你可以使用平均2.66个比较而不是三个来对三元素集合进行排序。这样可以节省每个子集合的1/3比较。也许,除非您正在排序50K元素: - )。

祝你好运。