/media/sda-magnetic/david/Dokumente-15/fernuni-hagen/cs-i-ii/old-cs-2-03/sort-and-algorithms/sortingbymerging/mergesort.c


#include <stdio.h>
#include <stdlib.h>

int a[32];

void merge(int des[], int src1[], int src2[], int i1, int i2, int len) {
    int i;
    int j1, j2;
    
    j1 = i1;
    j2 = i2;
    
    for(i = 0;  i < len;  i++) {
        if((src1[j1] < src2[j2]) && (j1 < (i1 + len)) && (j2 < (i2 + len))){
            des[i] = src1[j1];
            j1++;
        }
        else if((src1[j1] >= src2[j2]) && (j2 < (i2 + len)) && (j1 < (i1 + len))) {
            des[i] = src2[j2];
            j2++;
        }
        else if((j1 > (i1 + len)) && (j2 < (i2 + len))) {
            des[i] = src2[j2];
            j2++;
        }
        else if((j1 < (i1 + len)) && (j2 > (i2 + len))) {
            des[i] = src1[j1];
            j1++;
        }
    }
    
return;
}

void copyarray(int des[], int src[], int i, int n) {
    int j;
    
    for(j = 0; j < n; j++, i++)
        des[j] = src[i];
    
return;
}

int mergesort(int a[]) {
    int len;
    int b[32];
    int c[32];
    int d[32];
    int start1;
    int start2;
    int i, j;
 
    start1 = 0;
    start2 = 0;
    for (len = 1;  len < 32;  len *= 2) {
        for(start1 = 0;  start1 < len;  start1 += (2*len)) {
            start2 = start1 + len;
            copyarray(b, a, start1, len);
            copyarray(c, a, start2, len);
            merge(d, b, c, 0, 0, len*2);
            for (j = 0;  j < len*2;  j++)
                a[start1+j] = d[j];
        }
    }
}


int main(void) {
    int i;
    
    srand(5);
    
    for(i = 0;  i < 32;  i++)
        a[i] = rand() % 64;
    
    mergesort(a);
    
    for(i = 0;  i < 32;  i++)
        printf("%i ", a[i]);
    
}