C 我不理解这一步,尤其是在合并排序中

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

在上面的代码中,我不理解这一点。它再次调用merge sort,但当函数反复调用mergesort时,domerge开始发挥作用 但是什么时候合并呢 我无法理解的代码是递归的,在分解成两半、重复调用mergesort和分解inrto后,单个elment merge如何发挥作用。 真正的问题是真实如何发挥作用

#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;