您的位置:首页 > 其它

10-排序-04-归并排序

2013-12-26 20:59 211 查看

归并排序

归并排序是将两个或两个以上的有序子表合并成一个新

的有序表。

基本思想:

(1)将n个记录的待排序序列看成是有n个长度都为1的有序子表组成。

(2)将两两相邻的子表归并为一个有序子表。

(3)重复上述步骤,直至归并为一个长度为n的有序表。

例:设初始关键字序列为:49 38 65 97 76 13 27 20

执行归并排序的过程如图所示:



算法:

void Merge (int low,int mm,int high)
// 两个相邻有序段的合并
{ RecType  *R1;
while(i<=mm&&j<=high)
R1[p++]=(R[i].key<=R[j].key)?R[i++]:R[j++];
while(i<=mm)
R1[p++]=R[i++];
while(j<=high)
R1[p++]=R[j++];
for(p=0,i=low;i<=high;p++,i++)
R[i]=R1[p];
}
void MergePass(int length)    // 完成一趟完整的合并
{ for (i=1;i+2*length-1<=L;i=i+2*length)
Merge(i,i+length-1,i+2*length-1);
if (i+length-1<L)
Merge(i,i+length-1,L);
}
 
void Mergesort()
// 控制有序段的长度,每合并一趟,有序段长加倍
{ for (length=1;length<L;length*=2)
{ MergePass(length);
m++;
}
}



效率分析:

    对n个元素的序列,执行二路归并算法,则必须做log2n趟归并,每一趟归并的时间复杂度是O(n),所以二路归并的时间复杂度为O(nlog2n)。

    两路归并排序需要和待排序序列一样多的辅助空间。其空间复杂度为O(n)。

    两路归并排序也是一种稳定性的排序。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: