Bottom Up合并排序在哪里有用?

时间:2013-07-02 05:19:08

标签: algorithm sorting language-agnostic merge mergesort

我一直在阅读Sedgewick&amp ;;的“算法,第四版”。韦恩。本书介绍了两种使用合并排序的方法。使用标准的自顶向下递归合并排序或自底向上合并排序。

是否存在自下而上合并排序优先于自上而下版本的情况?

3 个答案:

答案 0 :(得分:8)

递归mergesort需要O(log n)空间用于递归堆栈,但自下而上的版本可以让你做得更好(没有递归堆栈,只有几个整数跟踪你在输入中的位置)。

如果您遇到一些不支持递归的语言并且只为堆栈(可能是嵌入式系统?)提供有限的内存,那么自下而上的版本将是您唯一的选择。

Here's自下而上版本,显示我的意思。

答案 1 :(得分:2)

自下而上的合并排序几乎不能在内存中工作,数据被分类保存在外部设备(例如磁带)上。我认为这是它在50年代和60年代的工作方式,我们在旧电影中看到的那些高大的磁带机。

换句话说,自下而上合并是在线算法。它可以在没有随机访问的情况下工作。

我们首先处理输入磁带并在读取输入磁带时写出每个2个元素的排序块,写入两个磁带,在两个磁带之间交替。然后我们从我们刚写入的两个磁带中读取2个块,并在输出磁带之间交替写出4个合并的块。然后我们再次切换输入和输出,然后按8块等进行操作。在上一次运行中,只有一个磁带被写入 - 这就是结果。

这可以在现代RAM硬件上进行仿真,只需要额外的O(1)内存,并且可以就地进行合并。为了处理“短悬的尾巴”问题(对于2^n+k这样的长度,对于小k),沿着输入序列的扫描可以交替地向前或向后进行。

答案 2 :(得分:1)

具有相同的复杂性只有很小的差异,例如它进行合并的顺序。左 - 右 - 向上为递归的,而水平为自下而上。同样递归使它有点slower sometimes,我认为不那么直观。