如何将数组的后半部分逐个合并到上半部分?

时间:2014-10-29 14:19:42

标签: c arrays algorithm

假设我们有一个包含2m元素的数组。我们可以将数组分成两部分,第一部分和后一部分。我的问题是如何将数组的后一部分逐个插入第一部分,例如数组

{1,2,3,4,5,6,7,8,9,10} 
合并后

我们有了新的数组

{1,6,2,7,3,8,4,9,5,10}

我知道一些方法,例如使用另一个缓冲区来存储临时数据,但要求空间复杂度应为O(1)。

我的问题是,是否存在具有O(n)时间复杂度和O(1)空间复杂度的优化方法?

2 个答案:

答案 0 :(得分:0)

可以使用2个temp变量完成,假设数组为{1,2,3,4,5,6,7,8,9,10}

1:你开始时有2个指针,temp1位于起点,temp2位于中途位置(位于6)。

2:您在数组的第一个位置存储temp11的值,让temp1具有第二个元素的值,即2

3:同样地,您将temp26存储在数组的下一个位置,让temp2具有下一个值,即7 ..

继续此操作,直到temp1到达中途,temp2到达终点,然后您可以获得所需的结果。

答案 1 :(得分:0)

如果可能的话,最好的方法是简单地定义一个以正确顺序执行寻址的迭代器,这样就可以保留所有数据,只需更改解决它的顺序。

如果你不能这样做,你显然需要就地合并。我发现的就地合并的最简洁的解释是article on Dr. Dobbs。像大多数此类论文/文章一样,这是假设意图是合并作为合并排序实现的一部分而编写的。因此,它是根据查找符合排序标准的值范围编写的。在您的情况下,该部分不适用 - 您只想将两半合并为您可能认为的完美交错,因此您只需根据放置选择范围而不是基于搜索正确的位置比较值。合并本身的操作完全相同。

参考书目

  1. Practical in-Place Merging
  2. Practical In-Place MergeSort
  3. Optimal and Efficient In-Place Merging
  4. Parallel in-place merge
  5. In-Place Merge-Sort Demystified