个人学习笔记
归并排序算法:
例如有10个元素的排序码为:
(45,53,18,36,72,30,48,93,15,36)
归并排序过程如下图所示
(0)[45] [53] [18] [36] [72] [30] [48] [93] [15] [36]
(1)[45   53] [18  36] [30  72] [48  93] [15  36]
(2)[18  36  45  53] [30  48  72  93] [15  36]
(3)[18  30  36  45  48  53  72  93] [15  36]
(4)[15  18  30  36  36  45  48   53  72  93]
二路归并算法描述为: 
 void Twomerge(ElemType A[],ElemType R[],int s,int m,int t)
void Twomerge(ElemType A[],ElemType R[],int s,int m,int t)


 {
{
 int i,j,k;
  int i,j,k;
 i=s;j=m+1;k=s;
  i=s;j=m+1;k=s;
 while(i<=m&&j<=t)
  while(i<=m&&j<=t)
 if (A[i].stn<=A[j].stn)
    if (A[i].stn<=A[j].stn)

 
        {R[k]=A[i];i++;k++}
{R[k]=A[i];i++;k++}
 else
     else

 
        {R[k]=A[j];j++;k++}
{R[k]=A[j];j++;k++}
 while(i<=m)
  while(i<=m)

 
    {R[k]=A[i];i++;k++}
{R[k]=A[i];i++;k++}  
 while(j<=t)
  while(j<=t)       

 
    {R[k]=A[j];j++;k++}
{R[k]=A[j];j++;k++}   
 }
}进行一趟归并的算法描述:
 void MergePass(EelmType A[],int n,int len)
void MergePass(EelmType A[],int n,int len)
 //把数组A[]中的每个长度为len的有序表两两归并
//把数组A[]中的每个长度为len的有序表两两归并
 //到数组R[]中
//到数组R[]中


 {int p=0;
{int p=0;
 while (p+2*len-1<=n-1)
 while (p+2*len-1<=n-1)

 
   {  //两两归并长度均为len的有序表
{  //两两归并长度均为len的有序表
 ToeMerge(A,R,p,p+len-1,p+2*len-1);
   ToeMerge(A,R,p,p+len-1,p+2*len-1);
 p+=2*len;
   p+=2*len;
 }
  }

 if (p+len-1<n-1)//归并两个长度不等的有序表
 if (p+len-1<n-1)//归并两个长度不等的有序表
 TwoMerge(A,R,p,p+len-1,n-1);
  TwoMerge(A,R,p,p+len-1,n-1);
 else
 else
 for(int i=p;i<=n-1;i++)
  for(int i=p;i<=n-1;i++)
 R[i]=A[i];//把剩余最后一个有序表复制到R中
         R[i]=A[i];//把剩余最后一个有序表复制到R中
 }
}二路归并排序的算法描述: