外部排序:归并排序法
思维导图:
外部归并排序的原理:
第一步:
第二步:
问题:内存缓存区大小固定,外存数据元素分块后仍然无法将俩块放入比较
答:因为归并段已经块内有序,所以只需要将归并段部分装入内存,比较每个归并段相同位置元素的先后次序写入结果集即可
例:有俩个归并段1358和2467,每个缓存区可以存放2个数据元素
1、先将俩个个归并段的前俩个数据元素写入内存
2、然后12比较输出1,缓存区1标记后移;23比较输出2,标记后移;
3、输出缓存区满,写入外存
4、然后34比较输出3,缓存区1比较完毕清空,将后俩个数据元素放入继续比较
5、重复上述的过程直到比较结束
外部归并排序的性能:
归并段个数 * 每个归并段内部排序时间 + 磁盘IO读写的次数 * 每个归并块读写的时间 + 归并趟数 * 比较次数
3:排序成归并块的读写、俩次归并排序的读写
(4+4) : 四次读 + 四次写
ps: IO读写的时间 >> 内部排序时间,所以优化外部归并排序,就要减少IO读写次数
问题: 如何减少IO读写次数?
答: 二路归并排序变四路归并排序
总时间主要是受 外存读写时间的控制,而外存读写时间受归并趟数的影响,所以,要想减少总时间,就要减少归并趟数(多路归并)
归并排序法的优化:
1、让K值增大
1、即增加归并路数(会增加关键字对比次数,即增加内部排序时间)
2、用败者树减少关键字对比次数
2、让r减小
1、增大每块缓冲区容量
2、用“置换-选择排序”减少初始归并段数量