为什么数组在自上而下的mergesort中访问6NlogN?

时间:2017-02-20 03:27:15

标签: arrays algorithm merge mergesort array-merge

我不太明白为什么要通过自上而下的合并排序对长度为N的数组进行排序,它只需要6NlogN数组访问。 (每个级别需要6N,高度为lgN,所以总共为6NlgN)

每个合并最多使用6N阵列访问(副本为2N,后退为2N,比较最多为2N)

是不是将N个元素复制到辅助数组中并将其复制回原始数组,即2N?什么是2N“后撤”?

问题实际上来自Mergesort of Algorithms中的Progosition G.我想是这样的。

这是下面书中的代码:

public static void merge(Comparable[] a, int lo, int mid, int hi) 
{  // Merge a[lo..mid] with a[mid+1..hi].
   int i = lo, j = mid+1;
   for (int k = lo; k <= hi; k++)  // Copy a[lo..hi] to aux[lo..hi].
      aux[k] = a[k];
   for (int k = lo; k <= hi; k++)  // Merge back to a[lo..hi].
      if      (i > mid)              a[k] = aux[j++];
      else if (j > hi )              a[k] = aux[i++];
      else if (less(aux[j], aux[i])) a[k] = aux[j++];
      else                           a[k] = aux[i++]; 
}

public class Merge 
{  
   private static Comparable[] aux;      // auxiliary array for merges
   public static void sort(Comparable[] a)
   {
      aux = new Comparable[a.length];    // Allocate space just once.
      sort(a, 0, a.length - 1);
   }
   private static void sort(Comparable[] a, int lo, int hi)
   {  // Sort a[lo..hi].
      if (hi <= lo) return;
      int mid = lo + (hi - lo)/2;
      sort(a, lo, mid);       // Sort left half.
      sort(a, mid+1, hi);     // Sort right half.
      merge(a, lo, mid, hi);  // Merge results (code on page 271).
   } 
}

1 个答案:

答案 0 :(得分:3)

我能看到的是你只调用了读取操作&#34;数组访问&#34;而本书同时将读取和写入操作称为&#34;数组访问&#34;。 查看merge代码。这里有2个数组访问:

aux[k] = a[k];

a上的读取操作和aux上的写入操作。然后在这里:

a[k] = aux[j++]; //or aux[i++];

您还有另外两个,这次是aux上的读取和a上的写入。最后,你可能还有两个读数:

less(aux[j], aux[i])

总而言之:6次数组访问(4次读取和2次写入)。

正如您所提到的,算法深度为logN,因此我们得到了6NlogN。