我一直在研究合并排序算法,我不能断定实际创建了多少数组作为算法的一部分。某些文献称整个原始数组被复制到一个已排序的新数组中。但这意味着只创建了2个阵列。
据我所知,合并排序算法有两个主要步骤。拆分和合并。我想如果你给合并排序一个100个插槽的数组,它实际上会创建新的数组,因为它从100>向下分割中间。 50/50> 25/25> 12/13> 6/5> 3/3> 1/1。在此之后所有这些分裂之后,它在内存中有12或13个数组。然后当它最终将所有这些复制到1> 1的新阵列中时。 2> 3或4> 6> 12> 25> 50> 100.
这是另外8个阵列(粗略地说)。
但在教科书中,我读到了这样的内容:
您可能想知道所有这些子阵列在内存中的位置。在里面 算法,与原始数组大小相同的工作空间数组 创建。子阵列存储在工作空间数组的各个部分中。 这意味着原始数组中的子数组将被复制到 工作区数组中的适当位置。每次合并后, workspace数组被复制回原始数组。
- Java中的数据结构和算法作者:Robert Lafore
答案 0 :(得分:1)
考虑典型合并排序实现的一对最后阶段。我们需要两个数组 - 主数组和辅助数组,以及从aux数组到主数组的子数组。
在某个合并阶段之前(|
表示每个数组的开始(起始索引)) - 我们将A子阵列与B子阵列合并以填充目标数组的前半部分,并将C子阵列与D子阵列合并到填充目标数组的后半部分:
Auxiliary array: |AAAA|BBBB|CCCC|DDDD
Main array: ..................
合并后(我使用任意顺序)
Auxiliary array: ...............
Main array: ABBABBAADCDDCCDC
复制后,在最终合并之前
Auxiliary array: |ABBABBAA|DCDDCCDC
Main array: ................
答案 1 :(得分:0)
即使你"分裂"您不必创建2个新阵列的阵列。 你总是有相同数量的插槽(这里100个,即使它是50 * 2或25 * 4 ......)
您只需将数据移动到阵列中的正确位置(首先拆分50个第一个插槽后的第一个插槽,最后50个插槽是第二个插槽)
您不必存储数组,只需存储它们在大数组中的起始位置。
答案 2 :(得分:0)
教科书指的是合理有效的合并实现,其中工作空间数组的一次性分配与原始数据相同。在那之后,然后要合并的所有子数组都是工作空间数组或原始数组的一部分,通过索引(或指针)访问。
自顶向下合并排序使用递归生成一组索引对的动态堆栈来表示子数组。自底向上合并排序会跳过递归,并使用迭代生成索引,从子数组大小1开始。