1.归并排序算法的思想
2路归并排序:假设原始序列含有n个记录,则把它们看成是n个有序的子序列,每个子序列的长度为1,然后两两归并,得到【n/2】(不小于n/2的最小整数)个长度为2或者1的有序子序列;再两两归并,……,如此重复,知道得到一个长度为n的有序序列为止。
2.归并排序的实现
void MergeSort(SqList *L)
{
Msort(L->r,L->r,1,L->length);
}
//将SR[s..t]归并排序为TR1[s..t]
void MSort(int SR[],int TR1[],int s,int t)
{
int m;
int TR2[MAXSIZE+1];
if (s==t)
{
TR2[s]=SR[s];
}
else
{
m=(s+t)/2; //将SR[s..t]平分为SR[s..m]和SR[m+1,t]
MSort(SR,TR2,s,m); //递归将SR[s..m]归并为有序的TR2[s..m]
MSort(SR,TR2,m,t); //递归将SR[m+1..t]归并为有序的TR2[m+1..t]
Merge(TR2,TR1,s,m,t); //将TR2[s..m]和TR2[m+1..t]归并为到TR1[s..t]
}
}
//将有序的SR[i..m]和SR[m+1..n]归并为有序的TR[i..n]
void Merge(int SR[],int TR[],int i,int m,int n)
{
int j,k,l;
j=m+1;
k=i;
while(i<=m && j<=n) //将SR中的记录由小到大归并入TR
{
if(SR[i]>SR[j])
{
TR[k++]=SR[j++];
}
else
{
TR[k++]=SR[i++];
}
}
if (i<=m) //将剩余的SR[i..m]复制到TR
{
for (l=0;l<m-i;l++)
{
TR[k+1]=SR[i+1];
}
}
if (j<=n) //将剩余的SR[j..n]复制到TR
{
for (l=0;l<n-j;l++)
{
TR[k+1]=SR[j+1];
}
}
}
3.非递归实现归并排序
//对顺序表L作归并非递归排序
void MergeSort2(SqList *L)
{
int *TR =(int*)malloc(L->length()*sizeof(int));
int k=1;
while (k<L->length)
{
MergePass(L->r,TR,k,L->length);
k=2*k;
MergePass(TR,L->r,k,L->length);
k=2*k;
}
}
//将SR[]中相邻长度为s的子序列两两归并到TR[]
void MergePass(int SR[],int TR[],int s, int t)
{
int i=1;
int j;
while (i <= n-2*s+1)
{
Merge(SR,TR,i,i+s-1,i+2*s-1); //两两归并
i = i+2*s;
}
if(i < n-s+1)
{
Merge(SR,TR,i,i+s-1,n);
}
else
{
for (j=i;j<=n;j++)
{
TR[j]=SR[j];
}
}
}