【发布时间】:2017-07-09 05:26:12
【问题描述】:
我不太明白为什么要通过自上而下的归并排序对长度为 N 的数组进行排序,它只需要 6NlogN 次数组访问。 (每关需要6N,高度是lgN,所以一共是6NlgN)
每次合并最多使用 6N 次数组访问(2N 用于复制,2N 用于后移,最多 2N 用于比较)
不是把N个元素复制到辅助数组中再复制回原来的数组,也就是2N吗? 2N“后退”从何而来?
这个问题实际上来自算法合并排序中的 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).
}
}
【问题讨论】:
标签: arrays algorithm merge mergesort array-merge