一 K路归并排序及其优化-败者树
外部排序由两个相对独立的阶段组成。首先,按可用内存的大小,将外存的n个记录分成若干长度的子文件或段,并且读取每个子文件对其进行单独的内排序,然后再写回外存;然后,再对这些归并段进行足趟归并,使得归并段逐渐变大,直到每个归并段有序。
普通二路归并导致磁盘读写次数很大,合理使用k路归并可以合理减少磁盘读写次数。但是传统的k路归并又带来另外一个问题:每次归并k个有序段的一个记录,需要进行k-1次比较。但如果采用败者树,则可以把比较次数降为logk,,使得最终的归并时间不受k值影响。
败者树也是一颗完全二叉树,它是树形选择排序的一种变形,败者树的双亲节点记录两个节点之间的败者,而让胜者去参加更高一层的比赛。
二 参考代码
#include <iostream>
using namespace std;
#define LEN 10 //最大归并段长
#define MINKEY -1 //默认全为正数

本文介绍了K路归并排序的原理,强调了如何通过败者树优化K路归并过程中的比较次数,降低了磁盘读写成本。败者树是一种完全二叉树,用于树形选择排序,能将比较次数从k-1次减少到logk次,确保归并时间不随k值增大而增加。
最低0.47元/天 解锁文章
4877

被折叠的 条评论
为什么被折叠?



