将k个排序数组合并为一个排序数组

时间:2015-01-19 21:32:18

标签: algorithm merge

我想编写一个时间O(n * lgk)的算法,用于将k个排序数组合并到一个排序数组中,其中n是所有输入数组的元素总数。

你能否给我一个暗示我们如何做到这一点?

编辑:我写了以下算法:

Algorithm(L) // L=[L1, L2, L3, ...., Lk]
  list=LNEW;
  for (i=1; i<=k; i++){
      H[i]=L[i][1];
  }
  BUILD-HEAP(H);
  j=1;
  while (j<n){
         LNEW[j]=H[1];
         yes=0;
         m=1;
         while (m<=k and L[m][j]!=NULL and L[m][j+1]!=NULL and yes!=1){
                if (H[1]==L[m][j]){
                    H[1]=L[m][j+1];
                    yes=1;
                    Heapify(H);
                }
                j=j+1;
  }

你能告诉我它是否正确吗?

1 个答案:

答案 0 :(得分:0)

我们可以维护一个k元素firstFree数组,其中firstFree [i]是第i个数组中第一个未使用的元素。另外,我们可以有一个最多包含k个元素的堆(每个元素都是一对(value,包含该值的数组的索引))。最初,我们应该将所有给定数组的第一个元素放入此堆中。之后,我们应该重复以下过程,直到堆为空:

  1. 弹出堆的顶部元素。将其添加到输出数组。

  2. 增加包含此元素的数组的firstFree值。如果它不超过此数组的大小,请将下一个元素添加到堆中。

  3. 该算法执行n次插入和弹出操作,因此其时间复杂度为O(n log k)。