将两个排序的数组合并为第三个可以在O(n)中完成?

时间:2012-05-01 04:41:20

标签: arrays algorithm sorting merge

我正在尝试将排序的数组合并到第三个排序的数组中,但我看不到 在O(n)只能在O(n*n)中执行此操作的任何方式。我错了吗?有没有办法在O(n)中做到这一点?

修改:

实际上问题有点不同:

我有2个已排序的跳过列表,我想将它们合并到一个新的已排序的跳过列表中,而不进行更改 输入(即两个跳过列表)。

我在考虑:

  • 将列表放在两个数组中

  • 使用MergeSort合并两个数组(这需要O(n)运行时)

  • 从排序数组中构建一个新的跳过列表.... //我不确定它的运行时

任何想法?

此致

6 个答案:

答案 0 :(得分:10)

你保持两个循环,当你从每个'side'将值拉到第三个数组时,在每个循环之间切换。如果arr1的值小于当前的arr2,那么将arr1的值填入arr3直到你达到相等或“更大”,然后你翻转过程并开始从arr2中拉出值。然后继续反复弹跳,直到任何一个源阵列都没有留下任何东西。

出现在O(n + m),又名O(n)。

答案 1 :(得分:9)

将两个阵列一个放在另一个上面:

list1的= [1,2,6,10]

列表2 = [3,4,10]

如果我们从左边开始并向右走,比较项目,每次我们取最小值并将它放在第三个数组中。从我们从中获取最小项目的列表开始,我们将进入下一个项目。

i=0,j=0
list1[i] < list2[j]
take 1
i+=1
2<3
take 2
i+=1
3<6
take 3
j+=1

等。

直到我们得到最终的合并数组[1,2,3,..]

因为为第三个数组选择每个元素只需要一次移动,所以它基本上是O(N)。

答案 2 :(得分:1)

您可以为已排序的数组使用两个索引变量,为要排序的数组使用另一个索引变量,所有这些变量都初始化为0。 现在,虽然您没有使用任何已排序的数组到达末尾,但是比较每次迭代中的两个指向值,取较高(或更低,取决于您的排序)值并增加指向您的值的索引刚刚使用过。

最后,浏览一下你尚未完成的数组,然后将剩余的值粘贴到合并的数组中。

这样,你只会经历一次值,这意味着O(n)。

答案 3 :(得分:0)

提示:仅考虑两个列表的头元素(并在处理时[虚拟]删除它们)。

答案 4 :(得分:0)

如果两个输入列表都已排序,那么合并怎么可能是O(n * n)?你自己给出的算法(3个步骤)肯定是O(n)而不是O(n * n)。每个步骤都是O(n),因此总体而言是O(n)。 big-O由算法的最高阶决定。在完成作业之前一定要了解big-O的概念。

答案 5 :(得分:0)

是的,可以这样做,实际上它会是 O(n + m),其中n和m是第一个和第二个数组的连续长度。

  

该算法称为一次合并

伪代码:

i, j, k = 0 // k is index for resulting array
//maximum length of the resulting array can be n+m, 
//so it is always safe to malloc for such a length if you are in C or C++

while(i< len(array1) and j < len(array2) )
     if (array1[i] == array2[j])
           result[k] = array1[i]
           ++i, ++j, ++k
     else if (array1[i] < array2[j])
           result[k] = array1[i]
           ++i, ++k
     else
           result[k] = array2[j] 
           ++j, ++k

//now one array might not be traversed all the way up
if ( i < len(array1) )
      while( i != len(array1))
            result[k] =  array1[i]
            ++i, ++k

else if ( j < len(array2) )
      while( j != len(array2) )
            result[k] = array2[j]
            ++j, ++k

基本上,您同时遍历两个数组,如果长度不同,则更大的数组不会一直遍历,因此您只需将较大数组的所有元素添加到结果