#include<stdio.h>
#include<stdlib.h>
void mergesort(int[], int, int);
void merge(int[], int, int, int);
void printarray(int[]);
int gs;
int main()
{
int* a,i,s;
printf("Enter size of the array\n");
scanf("%d",&s);
a = (int*)calloc(s,sizeof(int));
gs = s;
printf("Enter the array\n");
for(i=0;i<s;i++)
{
scanf("%d",&a[i]);
}
printf("Showing the array\n");
printarray(a);
printf("\n");
mergesort(a,0,s-1);
printf("The sorted array is:\n");
printarray(a);
free(a);
return 0;
}
void mergesort(int a[], int f, int l)
{
int m;
if(f<l)
{
m = (f+l)/2;
mergesort(a,f,m);
mergesort(a,m+1,l);
merge(a,f,m,l);
}
}
void merge(int a[], int f, int m, int l)
{
int* t,i,j,h1,h2;
t = (int*)calloc(l-f+1,sizeof(int));
h1 = f;
i = 0;
h2 = m+1;
while(h1 <= m && h2 <= l)
{
if(a[h1] < a[h2])
{
t[i] = a[h1];
h1++;
}
else
{
t[i] = a[h2];
h2++;
}
i++;
}
if(h1>m)
{
for(j=h2; j<=l; j++)
{
t[i] = a[j];
i++;
}
}
else
{
for(j=h1; j<=m; j++)
{
t[i] = a[j];
i++;
}
}
for(j=f;j<=l;j++)
a[j] = t[j -f];
free(t);
printarray(a);
}
void printarray(int a[])
{
int i;
for(i=0;i<gs;i++)
printf("%d ",a[i]);
printf("\n");
}
I2luY2x1ZGU8c3RkaW8uaD4KI2luY2x1ZGU8c3RkbGliLmg+CnZvaWQgbWVyZ2Vzb3J0KGludFtdLCBpbnQsIGludCk7CnZvaWQgbWVyZ2UoaW50W10sIGludCwgaW50LCBpbnQpOwp2b2lkIHByaW50YXJyYXkoaW50W10pOwoKaW50IGdzOwppbnQgbWFpbigpCnsKICAgIGludCogYSxpLHM7CiAgICBwcmludGYoIkVudGVyIHNpemUgb2YgdGhlIGFycmF5XG4iKTsKICAgIHNjYW5mKCIlZCIsJnMpOwogICAgYSA9IChpbnQqKWNhbGxvYyhzLHNpemVvZihpbnQpKTsKICAgIGdzID0gczsKICAgIHByaW50ZigiRW50ZXIgdGhlIGFycmF5XG4iKTsKICAgIGZvcihpPTA7aTxzO2krKykKICAgIHsKICAgICAgICBzY2FuZigiJWQiLCZhW2ldKTsKICAgIH0KCiAgICBwcmludGYoIlNob3dpbmcgdGhlIGFycmF5XG4iKTsKCiAgICBwcmludGFycmF5KGEpOwogICAgcHJpbnRmKCJcbiIpOwoKICAgIG1lcmdlc29ydChhLDAscy0xKTsKCiAgICBwcmludGYoIlRoZSBzb3J0ZWQgYXJyYXkgaXM6XG4iKTsKICAgIHByaW50YXJyYXkoYSk7CgogICAgZnJlZShhKTsKICAgIHJldHVybiAwOwp9Cgp2b2lkIG1lcmdlc29ydChpbnQgYVtdLCBpbnQgZiwgaW50IGwpCnsKICAgIGludCBtOwogICAgaWYoZjxsKQogICAgewogICAgICAgIG0gPSAoZitsKS8yOwogICAgICAgIG1lcmdlc29ydChhLGYsbSk7CiAgICAgICAgbWVyZ2Vzb3J0KGEsbSsxLGwpOwogICAgICAgIG1lcmdlKGEsZixtLGwpOwogICAgfQp9Cgp2b2lkIG1lcmdlKGludCBhW10sIGludCBmLCBpbnQgbSwgaW50IGwpCnsKICAgIGludCogdCxpLGosaDEsaDI7CiAgICB0ID0gKGludCopY2FsbG9jKGwtZisxLHNpemVvZihpbnQpKTsKICAgIGgxID0gZjsKICAgIGkgPSAwOwogICAgaDIgPSBtKzE7CiAgICB3aGlsZShoMSA8PSBtICYmIGgyIDw9IGwpCiAgICB7CiAgICAgICAgaWYoYVtoMV0gPCBhW2gyXSkKICAgICAgICB7CiAgICAgICAgICAgIHRbaV0gPSBhW2gxXTsKICAgICAgICAgICAgaDErKzsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgdFtpXSA9IGFbaDJdOwogICAgICAgICAgICBoMisrOwogICAgICAgIH0KICAgICAgICBpKys7CiAgICB9CgogICAgaWYoaDE+bSkKICAgIHsKICAgICAgICBmb3Ioaj1oMjsgajw9bDsgaisrKQogICAgICAgIHsKICAgICAgICAgICAgdFtpXSA9IGFbal07CiAgICAgICAgICAgIGkrKzsKICAgICAgICB9CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgZm9yKGo9aDE7IGo8PW07IGorKykKICAgICAgICB7CiAgICAgICAgICAgIHRbaV0gPSBhW2pdOwogICAgICAgICAgICBpKys7CiAgICAgICAgfQogICAgfQoKICAgIGZvcihqPWY7ajw9bDtqKyspCiAgICBhW2pdID0gdFtqIC1mXTsKCiAgICBmcmVlKHQpOwogICAgcHJpbnRhcnJheShhKTsKfQoKdm9pZCBwcmludGFycmF5KGludCBhW10pCnsKICAgIGludCBpOwogICAgZm9yKGk9MDtpPGdzO2krKykKICAgIHByaW50ZigiJWQgIixhW2ldKTsKICAgIHByaW50ZigiXG4iKTsKfQ==