归并排序
1、归并原理:把第一阶段所生成的顺串加以合并(例如通过若干次二路合并),直至变为一个顺串为止,即形成一个已排序的文件。
2、在K路归并中,最直接的方法就是作K-1次比较来找出所要的记录,但这样做花的代价较大,我们采用选择树的方法来实现K路归并。选择树是完全二叉树,有两种类型:赢者树和败者树。
(1)赢者树
在利用选择树进行归并时,将两个子女结点中的赢者(关键码值较小者)上升到父结点,称这种选择树为赢者树。因此,根结点是树中的最终赢者的索引,即为下一个要输出的记录结点。
赢者树的类定义:
template<class T> class WinerTree{
public:
Create(); //创建一个空的赢者树
Iitialize(T a[], int n); //返回比赛的赢者
Replay(i); //选手i变化时,重建赢者树
};
(2)败者树
在利用选择树进行归并时,将两个子女结点中的败者(关键码值较大者)上升到父结点,同时另加进一个结点以代表比赛的全局获胜者的索引值,称这种选择树为败者树。
败者树比赛过程:将新进入树的结点与其父结点进行比赛把败者存放在父结点中而把胜者再与上一级的父结点进行比赛这样的比赛不断进行,直到根结点处。并将全局获胜者的索引值存放在添加结点中。
3、多路归并的效率:假设对k个顺串进行归并。原始方法:找到每一个最小值的时间是Θ(k),产生一个大小为n的顺串的总时间是Θ (k×n)。败者树方法:初始化包含k个选手的败者树需要Θ (k)的时间;读入一个新值并重构败者树的时间为Θ (log k)。故产生一个大小为n的顺串的,总时间为Θ (k+n×logk)。
4、最佳归并树:如果在进行多路归并的时候,各初始顺串的长度不同,对外存扫描的次数,即执行时间会产生影响。把所有初始顺串的块数作为树的叶结点的权值,如果是K路归并则建立起一棵K-叉Huffman树。这样的一棵Huffman树就是最佳归并树。通过最佳归并树进行多路归并可以使对外存的I/O降到最少,提高归并执行效率。
1、归并原理:把第一阶段所生成的顺串加以合并(例如通过若干次二路合并),直至变为一个顺串为止,即形成一个已排序的文件。
2、在K路归并中,最直接的方法就是作K-1次比较来找出所要的记录,但这样做花的代价较大,我们采用选择树的方法来实现K路归并。选择树是完全二叉树,有两种类型:赢者树和败者树。
(1)赢者树
在利用选择树进行归并时,将两个子女结点中的赢者(关键码值较小者)上升到父结点,称这种选择树为赢者树。因此,根结点是树中的最终赢者的索引,即为下一个要输出的记录结点。
赢者树的类定义:
template<class T> class WinerTree{
public:
Create(); //创建一个空的赢者树
Iitialize(T a[], int n); //返回比赛的赢者
Replay(i); //选手i变化时,重建赢者树
};
(2)败者树
在利用选择树进行归并时,将两个子女结点中的败者(关键码值较大者)上升到父结点,同时另加进一个结点以代表比赛的全局获胜者的索引值,称这种选择树为败者树。
败者树比赛过程:将新进入树的结点与其父结点进行比赛把败者存放在父结点中而把胜者再与上一级的父结点进行比赛这样的比赛不断进行,直到根结点处。并将全局获胜者的索引值存放在添加结点中。
3、多路归并的效率:假设对k个顺串进行归并。原始方法:找到每一个最小值的时间是Θ(k),产生一个大小为n的顺串的总时间是Θ (k×n)。败者树方法:初始化包含k个选手的败者树需要Θ (k)的时间;读入一个新值并重构败者树的时间为Θ (log k)。故产生一个大小为n的顺串的,总时间为Θ (k+n×logk)。
4、最佳归并树:如果在进行多路归并的时候,各初始顺串的长度不同,对外存扫描的次数,即执行时间会产生影响。把所有初始顺串的块数作为树的叶结点的权值,如果是K路归并则建立起一棵K-叉Huffman树。这样的一棵Huffman树就是最佳归并树。通过最佳归并树进行多路归并可以使对外存的I/O降到最少,提高归并执行效率。