왜 N 길이의 배열을 하향식 병합 정렬로 정렬해야하는지 이해할 수 없지만 6NlogN 배열 액세스 만 필요합니다. (각각의 레벨이 6N 필요 높이 LGN이므로 총에 6NlgN있어)에 액세스하는 각각의 병합 가장 6N 어레이에서 사용탑 다운 병합에서 어레이가 6NlogN에 액세스하는 이유는 무엇입니까?
(복사 용 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).
}
}
오, 예. 나는 그것을 전혀 몰랐다. 지적 해 주셔서 감사합니다. :) – user1888955
도움이 되서 기쁩니다! 그건 그렇고 - 귀하의 질문을 해결 한 경우 대답을 수락하십시오. –