归并排序

来源:互联网 发布:securecrt mac 破解 编辑:程序博客网 时间:2024/06/06 02:55

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)

0 0
原创粉丝点击