Zrozumienie rekurencji łączenia

Większość implementacji mergesort, które widzę, jest podobna do tej. wstęp do książki algorytmów wraz z implantami online, których szukam. Moje kotlety rekurencyjne nie posuwają się znacznie dalej niż manipulowanie generacją Fibonacciego (co było dość proste), więc może to wielokrotne rekursje poruszają mój umysł, ale nie mogę nawet przejść przez kod i zrozumieć, co się dzieje, nawet zanim jeszcze trafię funkcja scalania.

W jaki sposób czy to przez to przechodzi? Czy jest jakaś strategia lub czytanie, które powinienem przejść, aby lepiej zrozumieć proces tutaj?

void mergesort(int *a, int*b, int low, int high)
{
    int pivot;
    if(low<high)
    {
        pivot=(low+high)/2;
        mergesort(a,b,low,pivot);
        mergesort(a,b,pivot+1,high);
        merge(a,b,low,pivot,high);
    }
}

i połączenie (chociaż szczerze mówiąc, utknąłem psychicznie, zanim nawet przejdę do tej części)

void merge(int *a, int *b, int low, int pivot, int high)
{
    int h,i,j,k;
    h=low;
    i=low;
    j=pivot+1;

    while((h<=pivot)&&(j<=high))
    {
        if(a[h]<=a[j])
        {
            b[i]=a[h];
            h++;
        }
        else
        {
            b[i]=a[j];
            j++;
        }
        i++;
    }
    if(h>pivot)
    {
        for(k=j; k<=high; k++)
        {
            b[i]=a[k];
            i++;
        }
    }
    else
    {
        for(k=h; k<=pivot; k++)
        {
            b[i]=a[k];
            i++;
        }
    }
    for(k=low; k<=high; k++) a[k]=b[k];
}

questionAnswers(9)

yourAnswerToTheQuestion