第11章外排序第2讲-磁盘排序-生成初始归并段

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
磁盘排序过程

F1文件


Fin文件
内存
写 F2文件

写…


内存
Fout文件
Fm文件
生成若干初始归并段
归并成一个有序文件
1/14
磁盘排序示例演示
设有一个文件Fin.dat,内含4500个记录:A1,A2,…, A4500,现在要对该文件进行排序,结果放在Fout.dat文件中。 可占用的内存空间至多只能对750个记录进行排序。
Fin.dat文件放在磁盘上。假设每个记录占用一个物理块。
Fin.dat文件
内存 (750)
Fout.dat文件
2/14
第1阶段:产生初始归并段
文件Fin.dat (含4500个记录)
某种内排序方法
容量为750个记录
产生6个长度为 750个记录的有序 文件F1~F6。
3/14
第2阶段:多路归并
可用内存空间大小为750个记录 可以使用多种归并方案来完成
13/14
━━本讲完━━
14/14
abc.dat
某内排序算法
内存
abc1.dat abc2.dat

abcn.dat
均有序
另一种方法:采用一种称为置换-选择排序方法用于 生成初始归并段。
可以减少生成的初始归并段个数
9/14
置换-选择排序方法
(1)从待排文件Fin中按内存工作区WA的容量w读入w个记录。设归并 段编号i=1。
(2)使用败者树从WA中选出关键字最小的记录Rmin。 (3)将Rmin记录输出到Fout中,作为当前归并段的一个成员。 (4)若Fin不空,则从Fin中读入下一个记录x放在Rmin所在的工作区位置 代替Rmin。 (5)在工作区中所有≥Rmin的记录中选择出最小记录作为新的Rmin,转 (3),直到选不出这样的Rmin。 (6)设i=i+1,开始一个新的归并段。 (7)若工作区已空,则初始归并段已全部产生;否则转(2)。
4/14
归并方案1:二路归并1
F1
F2
F3
F4
F5
F6
F7
F8
F9
F10
Fout
注意:
① 内存大小为750个记录,但任意大小的两个归并段都可以进行归并。 ② 每归并一次,参与归并的每个记录都要读一次和写一次。
5/14
方案1的读写记录数计算
F1
F2
F3
F4
F5
F6
F7
F1和F2中 每个记录
F8
F9
内存工作区w=5
Rmin=4113467895097246278
归并段1: 归并段2: 依次类推,产生归并段2:9,31,39,56,68,73,80,255
12/14
置换-选择排序中关键字比较次数分析 共有n个记录,内存工作区WA的容量为w:
若在w个记录中选取最小关键字的采用简单比较方法,每 次需要w-1次比较。 总的时间复杂度为O(nw)。
10/14
【例11-1】 设磁盘文件中共有18个记录,记录的关键字
分别为: {15,4,97,64,17,32,108,44,76,9,39,82,
56,31,80,73,255,68} 若内存工作区可容纳5个记录,用置换-选择排序可产生
几个初始归并段,每个初始归并段包含哪些记录?
11/14
置换-选择排序示例演示 18个记录(w=5): 15 4 97 64 17 32 108 44 76 9 39 82 56 31 80 73 255 68 ∞
读3次、
F10
写3次
Fout
总的读记录数(写记录数与之相同):
[(F1+F2+F3+F4的记录数) ×3+(F5+F6的记录数) ×2] =12000=8/3遍
该数越大,效率越差 等于哈夫曼树的WPL
6/14
归并方案2:二路归并2
F1
F2
F3
F4
F5
F6
பைடு நூலகம்F7
F8 F9
F10
Fout
方案2:总的读记录数WPL=15000。 方案1更好
方案1:总的读记录数WPL=12000。
7/14
归并方案3:三路归并
F7
F8
Fout
总的读记录数(写记录数与之相同):
方案3 :WPL=(750+750+750) ×2+ (750+750+750) ×2=9000
不同的归并方案所需要的读写记录数是不同的!
8/14
11.2.1 生成初始归并段
生成前面的初始归并段的方法
相关文档
最新文档