C 我不理解这一步,尤其是在合并排序中
在上面的代码中,我不理解这一点。它再次调用merge sort,但当函数反复调用mergesort时,domerge开始发挥作用 但是什么时候合并呢 我无法理解的代码是递归的,在分解成两半、重复调用mergesort和分解inrto后,单个elment merge如何发挥作用。 真正的问题是真实如何发挥作用C 我不理解这一步,尤其是在合并排序中,c,recursion,mergesort,C,Recursion,Mergesort,在上面的代码中,我不理解这一点。它再次调用merge sort,但当函数反复调用mergesort时,domerge开始发挥作用 但是什么时候合并呢 我无法理解的代码是递归的,在分解成两半、重复调用mergesort和分解inrto后,单个elment merge如何发挥作用。 真正的问题是真实如何发挥作用 #include <stdio.h> #include <stdlib.h> #define MAX_SIZE 50000 void merge (int arr
#include <stdio.h>
#include <stdlib.h>
#define MAX_SIZE 50000
void merge (int arr[], int start, int mid, int end){
/* two sorted arrays arr[start ... mid]
and arr[mid+1 ... end] merge them */
int tempvals[MAX_SIZE];
int ptr1, ptr2, ptrnew=0, idx;
ptr1 = start;
ptr2 = mid+1;
/* compare both the sorted arrays element by element
move the element that is smaller to the new aray */
while ( (ptr1 <= mid) && (ptr2 <= end)){
/* compare elements at ptr1 and ptr2 */
if (arr[ptr1] < arr[ptr2]){
tempvals[ptrnew] = arr[ptr1];
ptr1 ++; ptrnew++;
} else {
tempvals[ptrnew] = arr[ptr2];
ptr2 ++; ptrnew++;
}
}
/* at this point --> one of the pointers has reached the end */
while (ptr1 <= mid){
tempvals[ptrnew] = arr[ptr1];
ptr1 ++; ptrnew++;
}
while (ptr2 <= end){
tempvals[ptrnew] = arr[ptr2];
ptr2 ++; ptrnew++;
}
/* transfer back to arr */
for (idx = start, ptrnew = 0; idx <= end; idx++, ptrnew++)
arr[idx] = tempvals[ptrnew];
}
void merge_sort (int arr[], int start, int end){
int mid = (start + end)/2;
/* termination condition */
if( start >= end) return;
/* recurse */
merge_sort(arr,start, mid); /* first half */
merge_sort (arr, mid+1, end); /* second half */
merge (arr, start, mid, end); /* do the merging */
}
void print_array (int arr[], int size){
int i;
for (i=0; i < size; i++)
printf ("%d ",arr[i]);
printf ("\n");
}
int main(){
int arr[MAX_SIZE];
int i;
/* initialize */
for (i=0; i < MAX_SIZE; i++)
arr[i] = rand();
/* sort and print */
merge_sort (arr,0, MAX_SIZE - 1);
}
它位于注释递归下,并在逐行注释中调用。在merge\u sort上重复进行排序,以对数组的左侧和右侧进行排序。然后你调用merge让他们重新团聚,现在按顺序进行 您不会永远调用合并排序:请注意合并排序顶部的基本情况(也称为终止条件):
if( start >= end) return;
当您得到一个不超过一个元素的列表时,您只需返回——它已经按顺序排列好了。然后你爬回那个大的调用链,合并单个元素,然后是更大的列表。。。直到你完成。在两次递归调用
merge\u sort
之后,我也无法理解。当我得到不超过一个元素的列表时,它只是返回并退出函数,那么merge是如何发挥作用的?你所说的“爬回那个大的调用链”是什么意思@prune实际上,它是一个二叉树,而不是链条。这是你在进入单元素列表时所做的调用树。当您从这些页面返回时,您将沿着树爬回根目录,在每个阶段合并列表。找一本教科书,通过合并排序,并通过逻辑和价值观进行练习。或者,输入有用的print语句来跟踪yoru代码的执行——看看它是如何工作的。
if( start >= end) return;