目录
下一篇:外部排序优化
一、外存于内存间的数据交换
读入
修改
写回
外部排序思想:
二、操作步骤
1、使每个磁盘中的块内都有序
先读入两块数据进内存
使用内部排序
排好序后(指的是这里进入6内存的6个数全部有序,称为一个归并段)通过输出缓冲区写回磁盘
依次往后进行此操作,使得全部局部有序
8个归并段
2、进行归并段归并排序
从两个归并段中各拿出一个输入缓冲区的大小数据(注意他们经过内部排序都是是有序的)
凑足1kb后写回
当某一个输入缓冲区处理完后接着放入该区处理的归并段的下一个部分
最终这两个归并段
把剩余的归并段也做相同处理(2合1)
3、再按2的方法处理更大的归并段
注意一种情况:
如图这时缓冲区1的已处理完,应该读入该归并段1的下一块
此时有人就会觉得输出缓冲区剩下一个位置,输入缓冲区2再放入一个就空了,不如把13放入缓冲区再将两块输入缓冲区一起读入下一块。这就错了,我们这么处理输出缓冲区就是8、9、13
如果我们读入的下一块的起始是10,那么实际结果是8、9、10才是正确结果。所以一定要按规矩来
还有要注意的地方
我们归并好的归并段其实并没有存回原磁盘的位置,原来的位置归还给系统了,现在放置的位置是系统新分配的位置,这里为了美观,表面上像放回了原位
4、将下面两个归并段处理完
步骤都是与2一样的
通过3趟归并后就整体有序了(标号1的处理是内部排序不算一趟归并)
三、效率分析
时间开销
优化点:归并趟数
1、多路归并
规则和2路归并一样,只是多了2个缓冲区同时操作4个缓冲区
只有两个归并段时就使用二路归并
多路优化效率分析
所以k不能无限变大
2、减少r
k路平衡归并定义
反例: