将两个有序表直接归并到一个有序表中
void Merge(RecType R[],int low,int mid,int high)
{
RecType *R1;
int i=low,j=mid+1,k=0;//k是R1的下标,i,j分别为第一第二段的下标
R1=(RecType *)malloc((high-low=1)*sizeof(RecType)); //动态分配空间
while(i<=mid && j<=high) //在第1,2段均未扫描完时循环
if(R[i].key<=R[j].key //将第一段的元素放到R1中
{
R1[k]=R[i];
i++;k++;
}
else //第二段放入
{
R1[k]=R[j];
j++;k++;
}
while(i<=mid) //将第一段余下的部分复制到R1
{
R1[k]=R[i];
i++;k++;
}
while(j<=mid)
{
R1[k]=R[j];
j++;k++;
}
for(k=0,i=low;i<=high;k++,i++) //将R1复制到R[low..high]中
R[i]=R1[k];
free(R1);
}
一趟归并
void MergePass(RecType R[],int length,int n) //对整个排序进行一趟归并
{
int i;
for(i=0;i+2*length-1<n;i=i+2*length) //归并length长的两相邻子表
Merge(R,i,i+length-1,i+2*length-1);
if(i+length-1<n-1) //余下两个子表,后者长度小于length
Merge(R,i,i+length-1,n-1); //归并两个表
}
二路归并
void MergeSort(RecType R[],int n) //二路归并排序
{ int length;
for(length=1;length<n;length=2*length) //进行log2n归并
MergePass(R,length,n);
}