#include<stdio.h>
voidMergeSort(intr[],intn)
{
intlow,high,len;
len=1;
while
(len<n)
{
low=0;
while
(len+low<n)
{
high=low+len*2-1;
if
(high>=n)high=n-1;
if
(!SegmentMerge(r,low,high,len))
return
;
low=high+1;
}
len*=2;
}
}
intSegmentMerge(intr[],intlow,inthigh,intlen)
{
int
*r1,*r2;
intsize1,size2;
inti,j,k;
size1=len;
size2=high-low+1-len;
r1=(
int
*)
malloc
(size1*
sizeof
(
int
));
r2=(
int
*)
malloc
(size2*
sizeof
(
int
));
if
(r1==NULL||r2==NULL)
return0;
for
(i=0;i<size1;i++)
{
r1[i]=r[low+i];
}
for
(i=0;i<size2;i++)
{
r2[i]=r[low+size1+i];
}
i=0;
j=0;
k=low;
while
(i<size1&&j<size2)
{
if
(r1[i]<=r2[j])
r[k++]=r1[i++];
elser[k++]=r2[j++];
}
while
(i<size1)r[k++]=r1[i++];
while
(j<size2)r[k++]=r2[j++];
free
(r1);
free
(r2);
return1;
}
voidmain()
{
intr[5]={5,4,3,2,1};
inti;
printf
(
"Beforemergingsort:"
);
for
(i=0;i<5;i++)
printf
(
"%-3d"
,r[i]);
printf
(
"\n"
);
MergeSort(r,5);
printf
(
"Aftermergingsort:"
);
for
(i=0;i<5;i++)
printf
(
"%-3d"
,r[i]);
printf
(
"\n"
);
}