아래에 병합 정렬 프로그램이 있습니다. 주요 문제는 두 개의 정렬 된 목록을 병합하려면 선형 추가 메모리가 필요하며 추가 작업이 임시 배열에 복사하고 다시 사용하는 것입니다. 알고리즘 전반에 걸쳐 정렬 속도를 상당히 늦추는 효과가 있습니다. 이 복제는 재귀 수준에서 "a"및 "tmp_array"의 역할을 적절하게 전환하여 피할 수 있습니다.병합 정렬 최적화 이해 : 복사본 피하기
제 질문은 저자가 "반복적 인 수준의 재귀 수준에서 a 및 tmp_array의 역할을 적절하게 전환하여 복사를 피할 수있다"는 의미이며 다음 코드에서 어떻게 가능합니까? 우리가 이것을 어떻게 달성 할 수 있는지 예를 보여달라고 요청합니까?
void mergesort(input_type a[], unsigned int n) {
input_type *tmp_array;
tmp_array = (input_type *) malloc((n+1) * sizeof (input_type));
m_sort(a, tmp_array, 1, n);
free(tmp_array);
}
void m_sort(input_type a[], input_type tmp_array[ ], int left, int right) {
int center;
if(left < right) {
center = (left + right)/2;
m_sort(a, tmp_array, left, center);
m_sort(a, tmp_array, center+1, right);
merge(a, tmp_array, left, center+1, right);
}
}
void merge(input_type a[ ], input_type tmp_array[ ], int l_pos, int r_pos, int right_end) {
int i, left_end, num_elements, tmp_pos;
left_end = r_pos - 1;
tmp_pos = l_pos;
num_elements = right_end - l_pos + 1;
/* main loop */
while((1_pos <= left_end) && (r_pos <= right_end))
if(a[1_pos] <= a[r_pos])
tmp_array[tmp_pos++] = a[l_pos++];
else
tmp_array[tmp_pos++] = a[r_pos++];
while(l_pos <= left_end) /* copy rest of first half */
tmp_array[tmp_pos++] = a[l_pos++];
while(r_pos <= right_end) /* copy rest of second half */
tmp_array[tmp_pos++] = a[r_pos++];
/* copy tmp_array back */
for(i=1; i <= num_elements; i++, right_end--)
a[right_end] = tmp_array[right_end];
}