个人学习笔记
归并排序算法:
例如有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)
{
int i,j,k;
i=s;j=m+1;k=s;
while(i<=m&&j<=t)
if (A[i].stn<=A[j].stn)
{R[k]=A[i];i++;k++}
else
{R[k]=A[j];j++;k++}
while(i<=m)
{R[k]=A[i];i++;k++}
while(j<=t)
{R[k]=A[j];j++;k++}
} 进行一趟归并的算法描述:
void MergePass(EelmType A[],int n,int len)
//把数组A[]中的每个长度为len的有序表两两归并
//到数组R[]中
{int p=0;
while (p+2*len-1<=n-1)
{ //两两归并长度均为len的有序表
ToeMerge(A,R,p,p+len-1,p+2*len-1);
p+=2*len;
}
if (p+len-1<n-1)//归并两个长度不等的有序表
TwoMerge(A,R,p,p+len-1,n-1);
else
for(int i=p;i<=n-1;i++)
R[i]=A[i];//把剩余最后一个有序表复制到R中
} 二路归并排序的算法描述: