2路归并排序
归并排序的思想很容易,假设初始序列含有n个记录,则可看成是n个有序的序列,每个子序列的长度为1,然后两两归并,得到n/2个长度为2或1的有序子序列,再两两归并,直至得到一个长度为n的有序序列为止。,这种方法称为2路归并排序。
其算法代码如下
void Merge(RcdType SR[],RcdType &TR[],int I,int m,int n){
for(j=m+1,k=i;i<=m&&j<=n;++k){
if(LQ(SR[i).key,SR[j].key)) TR[k] = SR[i++];
else TR[k] = SR[j++];
}
if(j<=m) TR[k..n] = SR[i..m];
if(j<=n) TR[k..n] = SR[j..n];
}
void MSort(RcdType SR[],RcdType &TR1[],int s,int t){
if(s==t) TR1[s] = SR[s];
else{
m = (s+t)/2;
MSort(SR,TR2,s,m);
MSort(SR,TR2,m+1,t);
Merge(TR2,TR1,s,m,t);
}
}
void MergeSort(SqList &L){
MSort(L.r,L.r,1,L.length);
}
一趟归并排序的操作是,调用n/2h次算法merge将SR[1..n]中前后相邻且长度为h的有序段进行两两归并,得到前后相邻,长度为2h的有序段,并存放在TR[1..n]中,整个归并排序需进行logn趟,所以归并排序的时间复杂度为O(nlogn)