外部排序

外部排序步骤分为三步:

  1. 首先先内部排序
  2. 然后再不断地进行归并排序

所以外部排序时间 = 内部排序时间 + 磁盘读写时间 + 内部归并排序所需要的时间

减少磁盘读写时间

一趟磁盘读写时间最消耗时间,所以要减少磁盘读写的趟数,所以引入了多路平衡归并,这样可以减少磁盘读写的趟数。

所谓平衡归并,我自己的话来讲就是尽可能多的进行归并。对m个初始段进行k-路平衡归并所需要的趟数为 \(\lceil log_km \rceil\)

但是减少磁盘趟数会带来负面影响:

  1. 会使内部排序时间增多,因为引入了多路平衡归并。
  2. 由于有多个归并段,会使内存消耗变大。
  3. 内部归并排序所需要的时间会增多。

减少磁盘读写时间后产生的负面影响

为了减少第一个负面影响,引入“置换选择排序”。

为了减少第三个负面影响,引入“败者树”。

败者树(Tree of loser)

就是类似于两两比武最后决斗得出冠军。败者树使k个记录中关键字比较次数从 \(k-1\) 次变成了 \(\lceil log_2k \rceil\) 次。

置换选择排序(Replacement-selection sorting)

通过置换选择排序可以划分为更少的长度不等的归并段。

最佳归并树

就是哈夫曼树加上虚段。

如果:

  • (初始个数-1) % (k-1) == 0:说明不需要补充虚段。
  • (初始个数-1) % (k-1) == n: 说明要补充初始个数-1-n个虚段。
posted @ 2022-09-10 14:05  小默同学  阅读(79)  评论(0编辑  收藏  举报