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