假设我们有一个包含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)空间复杂度的优化方法?
答案 0 :(得分:0)
可以使用2个temp
变量完成,假设数组为{1,2,3,4,5,6,7,8,9,10}
1:你开始时有2个指针,temp1
位于起点,temp2
位于中途位置(位于6
)。
2:您在数组的第一个位置存储temp1
即1
的值,让temp1
具有第二个元素的值,即2
3:同样地,您将temp2
即6
存储在数组的下一个位置,让temp2
具有下一个值,即7
..
继续此操作,直到temp1
到达中途,temp2
到达终点,然后您可以获得所需的结果。
答案 1 :(得分:0)
如果可能的话,最好的方法是简单地定义一个以正确顺序执行寻址的迭代器,这样就可以保留所有数据,只需更改解决它的顺序。
如果你不能这样做,你显然需要就地合并。我发现的就地合并的最简洁的解释是article on Dr. Dobbs。像大多数此类论文/文章一样,这是假设意图是合并作为合并排序实现的一部分而编写的。因此,它是根据查找符合排序标准的值范围编写的。在您的情况下,该部分不适用 - 您只想将两半合并为您可能认为的完美交错,因此您只需根据放置选择范围而不是基于搜索正确的位置比较值。合并本身的操作完全相同。