知识大全 排序 - 归并排序(二)
Posted 文件
篇首语:莫道桑榆晚,为霞尚满天。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 排序 - 归并排序(二)相关的知识,希望对你有一定的参考价值。
归并排序
归并排序有两种实现方法 自底向上和自顶向下
自底向上的方法
( ) 自底向上的基本思想
自底向上的基本思想是 第 趟归并排序时 将待排序的文件R[ n]看作是n个长度为 的有序子文件 将这些子文件两两归并 若
n为偶数 则得到
>个长度为 的有序子文件;若n为奇数 则最后一个子文件轮空(不参与归并) 故本趟归并完成后 前
>个有序子文件长度为 但最后一个子文件长度仍为 ;第 趟归并则是将第 趟归并所得到的
>个有序的子文件两两归并 如此反复 直到最后得到一个长度为n的有序文件为止
上述的每次归并操作 均是将两个有序的子文件合并成一个有序的子文件 故称其为 二路归并排序 类似地有k(k> )路归并排序
( ) 二路归并排序的全过程
【 参见动画演示 】
( ) 一趟归并算法
分析
在某趟归并中 设各子文件长度为length(最后一个子文件的长度可能小于length) 则归并前R[ n]中共有
>个有序的子文件 R
[ length] R[length+ length] …
>注意
调用归并操作将相邻的一对子文件进行归并时 必须对子文件的个数可能是奇数 以及最后一个子文件的长度小于length这两种特殊
情况进行特殊处理
① 若子文件个数为奇数 则最后一个子文件无须和其它子文件归并(即本趟轮空);
② 若子文件个数为偶数 则要注意最后一对子文件中后一子文件的区间上界是n
具体算法如下
void MergePass(SeqList R int length)
//对R[ n]做一趟归并排序
int i;
for(i= ;i+ *length <=n;i=i+ *length)
Merge(R i i+length i+ *length );
//归并长度为length的两个相邻子文件
if(i+length
Merge(R,i,i+length-1,n); //归并最后两个子文件
//注意:若i≤n且i+length-1≥n时,则剩余一个子文件轮空,无须归并
//MergePass
(4)二路归并排序算法
void MergeSort(SeqList R)
//采用自底向上的方法,对R[1..n]进行二路归并排序
int length;
for(1ength=1;length MergePass(R,length); //有序段长度≥n时终止 注意: 自底向上的归并排序算法虽然效率较高,但可读性较差。tW.winGwIT
相关参考