您的位置:首页 > 其它

二路归并排序

2016-12-18 21:45 274 查看
         二路归并排序是将两个有序表合并成一个有序表的排序方法。
       
其基本思想为:序列中有n个记录,可以看作为n个有序子序列,每个序列长度为1。首先将每相邻的两个记录合并,得到┌n/2┒个较大的有序子序列,每个序列长度为2。再将上述子序列两两合并,得到┌┌n/2┒/2┒个有序子序列,直至得到一个长度为n的有序序列为止,排序结束。
二楼归并排序的算法如下:
void Merge(List a,List R,int h,int m,int n)
{
k=h;j=m+1;
while((h<=m)&&(j<n))
{
if(a[h].key<=a[j].key)
{
R[k]=a[h];
h++;
}
else{
R[k]=a[j];
j++;
}
k++;
}
while (h<=m)
{
R[k]=a[h];
h++;
k++;
}
while (j<=n)
{
R[k]=a[j];
j++;
k++;
}
}
void MergePass(List a,List b,int h)
{
i=1;
while(i<n-2*h+1)
{
merge(a,b,i,i+h-1,i+2*h-1);
i+=2*h;
}
if(i+h-1<n)
merge(a,b,i,i+h-1,n);
else
for(t=i;t<=n;t++)
b[t]=a[t];
}
void MergeSort(List a,int n)
{
m=1;
while(m<n)
{
MergePass(a,b,n,m);
m=2*m;
MergePass(b,a,n,m);
m=2*m;
}
}


       
归并排序算法的时间复杂度为O(nlog2n),当n较大时,归并排序的时间性能优于堆排序,但是它所需的存储量较多。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: