#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]);
}