外排序
排序之外部排序

排序之外部排序有时,待排序的⽂件很⼤,计算机内存不能容纳整个⽂件,这时候对⽂件就不能使⽤内部排序了(这⾥做⼀下说明,其实所有的排序都是在内存中做的,这⾥说的内部排序是指待排序的内容在内存中就可以完成,⽽外部排序是指待排序的内容不能在内存中⼀下⼦完成,它需要做内外存的内容交换),外部排序常采⽤的排序⽅法也是归并排序,这种归并⽅法由两个不同的阶段组成:1、采⽤适当的内部排序⽅法对输⼊⽂件的每个⽚段进⾏排序,将排好序的⽚段(成为归并段)写到外部存储器中(通常由⼀个可⽤的磁盘作为临时缓冲区),这样临时缓冲区中的每个归并段的内容是有序的。
2、利⽤归并算法,归并第⼀阶段⽣成的归并段,直到只剩下⼀个归并段为⽌。
例如要对外存中4500个记录进⾏归并,⽽内存⼤⼩只能容纳750个记录,在第⼀阶段,我们可以每次读取750个记录进⾏排序,这样可以分六次读取,进⾏排序,可以得到六个有序的归并段,如下图:每个归并段的⼤⼩是750个记录,记住,这些归并段已经全部写到临时缓冲区(由⼀个可⽤的磁盘充当)内了,这是第⼀步的排序结果。
完成第⼆步该怎么做呢?这时候归并算法就有⽤处了,算法描述如下:1、将内存空间划分为三份,每份⼤⼩250个记录,其中两个⽤作输⼊缓冲区,另外⼀个⽤作输出缓冲区。
⾸先对Segment_1和Segment_2进⾏归并,先从每个归并段中读取250个记录到输⼊缓冲区,对其归并,归并结果放到输出缓冲区,当输出缓冲区满后,将其写道临时缓冲区内,如果某个输⼊缓冲区空了,则从相应的归并段中再读取250个记录进⾏继续归并,反复以上步骤,直⾄Segment_1和Segment_2全都排好序,形成⼀个⼤⼩为1500的记录,然后对Segment_3和Segment_4、Segment_5和Segment_6进⾏同样的操作。
2、对归并好的⼤⼩为1500的记录进⾏如同步骤1⼀样的操作,进⾏继续排序,直⾄最后形成⼤⼩为4500的归并段,⾄此,排序结束。
第11章 外部排序

多路平衡归并的实现
二、胜者树及其使用 4路平衡归并
1 5
2 5
1234567 5 5 9 5 7 29 9
3 9
4
5
6
7
5
7
29
91
71
59
区
输
5
出
7
缓
冲
区
多路平衡归并的实现
二、胜者树及其使用 4路平衡归并
1
9
123
9 12 9
2
3
12
9
4567 16 12 29 9
4
5
6
7
16
12
29
9
输
5
7
29
9
入
16
12
38
22
缓
49
25
57
47
52
84
66
48
冲
78
91
71
59
区
输
5
出
7
缓
9
冲
区
多路平衡归并的实现
•采用胜者树,从 K 个元素中挑选一个最小的元素仅需 log2m × ( n - 1 ) × tmg 即内部归并时间与k无关, K 增大,归并趟数logkm减少 ,读写外存次数减少,外排总时间减少。
b[0]
b[1] b[2]
b[3]
5
7
29
9
输
5
7
29
9
入
内部排序和外部排序

排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。
我们这里说说八大排序就是内部排序。
当n较大,则应采用时间复杂度为O(nlog2n)的排序方法:快速排序、堆排序或归并排序序。
快速排序:是目前基于比较的内部排序中被认为是最好的方法,当待排序的关键字是随机分布时,快速排序的平均时间最短;基本思想:将一个记录插入到已排序好的有序表中,从而得到一个新,记录数增1的有序表。
即:先将序列的第1个记录看成是一个有序的子序列,然后从第2个记录逐个进行插入,直至整个序列有序为止。
要点:设立哨兵,作为临时存储和判断数组边界之用。
直接插入排序示例:如果碰见一个和插入元素相等的,那么插入元素把想插入的元素放在相等元素的后面。
所以,相等元素的前后顺序没有改变,从原无序序列出去的顺序就是排好序后的顺序,所以插入排序是稳定的。
算法的实现:1.void print(int a[], int n ,int i){2. cout<<i <<":";3.for(int j= 0; j<8; j++){4. cout<<a[j] <<" ";5. }6. cout<<endl;7.}8.9.10.void InsertSort(int a[], int n)11.{12.for(int i= 1; i<n; i++){13.if(a[i] < a[i-1]){ //若第i个元素大于i-1元素,直接插入。
小于的话,移动有序表后插入14.int j= i-1;15.int x = a[i]; //复制为哨兵,即存储待排序元素16. a[i] = a[i-1]; //先后移一个元素17.while(x < a[j]){ //查找在有序表的插入位置18. a[j+1] = a[j];19. j--; //元素后移20. }21. a[j+1] = x; //插入到正确位置22. }23. print(a,n,i); //打印每趟排序的结果24. }25.26.}27.28.int main(){29.int a[8] = {3,1,5,7,2,4,9,6};30. InsertSort(a,8);31. print(a,8,8);32.}效率:时间复杂度:O(n^2).其他的插入排序有二分插入排序,2-路插入排序。
外排序 置换选择算法

外排序置换选择算法
外排序(External Sorting)是一种处理大量数据的排序算法,当数据量太大,无法一次性装入内存时,就需要使用外排序。
置换-选择排序(Replacement-Selection Sort)是外排序的一种算法。
置换-选择排序的基本思想是:
1. 从待排序的数据中提取一个长度为K的子序列(K为常数),然后利用任何有效的内部排序算法对这个子序列进行排序。
2. 将排序后的子序列与原始数据记录进行比较,找出并输出所有比排序后子序列大的记录。
3. 重复步骤1和2,直到所有记录都排好序为止。
置换-选择排序的时间复杂度为O(n^2),其中n为待排序的数据量。
这是因为每次提取的子序列长度为常数K,所以需要比较的次数为O(n/K),而提
取子序列和内部排序的时间复杂度均为O(n)。
因此,总的时间复杂度为
O(n^2)。
置换-选择排序的优点是简单易实现,适用于数据量较大且内存受限的情况。
但是,由于其时间复杂度较高,对于大规模数据的排序效率较低。
因此,在
实际应用中,通常会采用其他更高效的外部排序算法,如多路归并排序、基数排序等。
外部排序

FI
WA
FO
23
实例:输入文件FI中记录关键字为:51、49、39、46、38、29 、14、61、15、30、1、48、52、3、63、27、4、13、89、 24、46、58、33、76,假定使用的内存可容纳 6 个记录,利 用置换-选择分类法产生初始合并段。 51 38 15 52 4 46 49 39 46 29 14 61 30 1 48 3 63 27 13 89 24 58 33 76 29 38 39 46 49 51 14 61 15 30 1
90 92 97
11
调整败者树的方法
以在b[4]补充15为例
5 4 2 5 2与5比较 4 2 4与2比较
0 6 90 0
1
3 4与3比较
10
1
9 2
20 3
15 6
4
8 5
12 6
调整败者树的方法: 将新补充的结点与其双亲结点比较, 败者留在该双亲结点,胜者继续向上直至树根的双亲
12
建败者树的过程
51 49 39 46 38 29
FI
WA
FO
19
实例:输入文件FI中记录关键字为:51、49、39、46、38、29 、14、61、15、30、1、48、52、3、63、27、4、13、89、 24、46、58、33、76,假定使用的内存可容纳 6 个记录,利 用置换-选择分类法产生初始合并段。 51 38 15 52 4 46 49 39 46 29 14 61 30 1 48 3 63 27 13 89 24 58 33 76 29 51 49 39 46 38 14
[数据结构] (依据:败者树为完全二叉树) 主:b[0.. k] b[0.. k-1]——k个叶结点 ,存放k个输入归并段中当前 参加归并的记录(缓冲区) b[k]——虚拟记录,该关键字取可能的最小值minkey 辅:ls[0.. k-1] ——不含叶结点的败者树 存放最后胜出的编号(ls[0])以及所记录的败者编号 [处理步骤] 建败者树ls[0.. k-1] 重复下列操作直至k路归并完毕
Sorting

:桶排序、计数排序、基数排序
简单选择排序
相对于冒泡排序: 交换次数相当少
例如: { 2, 2, 1}, 第一次选的时候变成 { 1, 2, 2 }, 两个2的次序就变了
不稳定排序
时间复杂度分析
最好 O(n^2) 最坏 O(n^2) 平均 O(n^2)
1.交换排序: 冒泡排序、快速排序
2.插入排序: 直接插入排序、希尔排序
4.归并排序
非基于比较的排序
:桶排序、计数排序、基数排序
3.基数排序(又叫鸽巢排序)
在计数排序中,当k很大时,时间和空间的开销都会增大(可以想一下对 序列{8888,1234,9999}用计数排序,此时不但浪费很多空间,而且时间 方面还不如比较排序.
基数排序时间T(n)=d*(2k+3n),其中d是记录值的位数, (2k+3n)是每一趟计数排序时间,上文分析过了,k不超 过9,d的值一般也很小,k、d都可以看成是一个很小的 常数,所以时间复杂度o(n)。最坏最佳情况并不改变 时间复杂度。基数排序是稳定的。辅助空间同计数排序 k+n.
维护一个k大小的堆 时间复杂度: O(n * log k)
1.交换排序: 冒泡排序、快速排序
2.插入排序: 直接插入排序、希尔排序
基于比较的排序
O ( N * log N )
3.选择排序: 简单选择排序、堆排序
4.归并排序
非基于比较的排序
:桶排序、计数排序、基数排序
每一趟归并都需要扫描一遍所有记录,耗时 O(n)
最好 O(n)
最坏 O(n^2)
平均 O(n^2)
1. 求冒泡排序总共需要交换的次数 50, 40, 95, 20, 15, 70, 60, 45,
外部排序分析

外部排序分析当对数据记录量巨⼤的数据⽂件进⾏排序时,由于受到内存容量的限制,⽆法将所有数据记录⼀次全部读⼊到内存进⾏。
排序过程中需要多次进⾏内、外存之间的数据交换。
利⽤外存对数据⽂件进⾏排序称为外部排序。
外部排序最基本的⽅法是归并。
这种⽅法是由两个相对独⽴的阶段组成:①按内存(缓冲区)的⼤⼩,将n个记录的数据⽂件分成若⼲个长度为l的段或⼦⽂件,依次读⼊内存并选择有效的内部排序⽅法进⾏排序;然后将排好序的有序⼦⽂件重新写⼊到外存。
⼦⽂件称为归并段或顺串。
②采⽤归并的办法对归并段进⾏逐趟归并,使归并段的长度逐渐增⼤,直到最后合并成只有⼀个归并段的⽂件—排好序的⽂件。
1 外部排序的简单⽅法归并排序有多种⽅法,最简单的就是2-路归并。
设有⼀个磁盘上的数据⽂件,共有100,000个记录(A1, A2,…,A100000),页块长为200个记录,供排序使⽤的缓冲区可提供容纳1000个记录的空间,现要对该⽂件进⾏排序,排序过程可按如下步骤进⾏:第⼀步:每次将5个页块(1000个记录)由外存读到内存,进⾏内排序,整个⽂件共得到10个初始顺串R1~R10 (每⼀个顺串占5个页块),然后把它们写回到磁盘上去。
第⼆步:然后两两归并,直到成为⼀个有序⽂件为⽌。
由图可知,每趟归并由m个归并段得到┌m/2┐个归并段。
2 外排序的时间分析外排序的时间消耗⽐内排序⼤得多,原因是:●外排序的数据量(记录)⼀般很⼤;●外排序涉及到内、外存之间的数据交换操作;●外存的操作速度远远⽐内存中的操作慢。
外排序的总时间由三部分组成:外排序的时间=产⽣初始归并段的时间(内排序)m×tis+I/O操作的时间d×tio+内部归并的时间s×utmg其中:m:初始归并段数⽬;tis:得到⼀个归并段的内排序时间;d:总的读、写次数;tio:⼀次读、写的时间;s:归并的趟数;utmg:对u个记录进⾏⼀趟内部归并排序的时间。
⼀般地,tio>>tis,tio>>tmg,tio⽽取决于所⽤外存,因此,影响外排序效率的主要原因是内、外存之间数据交换(读、写外存)。
【数据结构】排序——外部排序

【数据结构】排序——外部排序【数据结构】排序——外部排序外部排序是指⼤⽂件的排序,即排序的记录存储在外存储器上,在排序过程中需进⾏多次的内、外存之间的交换。
外部排序⽅法通常采⽤归并排序有外部排序基本上由两个相对独⽴的阶段组成。
按可⽤内存⼤⼩,将外存上含有n个记录的⽂件分成若⼲长度为l的字⽂件或段。
依次读⼊内存并利⽤有效的内部排序⽅法排序,将排序后得到的有序⼦⽂件(称为归并段或顺串),进⾏逐趟归并,直⾄得到整个有序⽂件为⽌。
在外部排序中实现两两归并,由于不可能将两个有序段及归并结果段同时存放在内存中的缘故,所以不仅要调⽤归并过程,还需要进⾏外存的读_写(对外存上信息的读_写是以“物理块”为单位的)。
耗费时间总时间=内部排序时间(产⽣初始归并段)+外存读写时间+内部归并时间内部排序时间=经过内部排序后得到的初始归并段的个数r * 得到⼀个初始归并段进⾏内部排序多需时间的均值外存读写时间=总的读写次数 * 进⾏⼀次外存读写时间的均值内部归并时间=归并的趟数s * n个记录进⾏内部归并排序的时间优化⽅法增⼤归并路数k减少初始归并段个数r以上两个⽅法都可以减少归并的趟数,进⽽减少读写磁盘的次数,提⾼外部排序速度多路平衡归并与败者树已知增加k可以减少s,从⽽减少总的读写次数。
如果只单纯的增加k⼜会导致内部归并时间增加。
为了使内部归并不受k的增⼤⽽影响,提出了败者树。
败者树的基本思想败者树是树形选择排序的⼀种变型,可视为⼀棵完全⼆叉树。
k个叶⼦节点分别存放k个归并段在归并过程中当前参加⽐较的记录,内部节点⽤来记忆左右⼦树中的“失败者”,⽽让胜者往上继续进⾏⽐较,⼀直到根结点。
若⽐较两个数,⼤的为败者、⼩的为胜利者,则根结点指向的数为最⼩数。
eg、设初始归并段为(10,15,31),(9,20),(6,15,42),(12,37),(84,95),利⽤败者树进⾏m路归并,⼿⼯执⾏选择最⼩的5个关键字的过程。
性能分析k-路归并的败者树的深度为[log2k]+1注意⚠ 在多路平衡归并中采⽤简单⽐较时,k越⼤,关键字的⽐较次数会越⼤。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
外排所需总的时间为: 外排所需总的时间为:
m*tIS + d*tIO + S*u*tmg = 10*tIS + 500*tIO + 4*10000*tmg
示例: 示例:
• 设有一个包含4500个对象的输入文件。现 设有一个包含4500个对象的输入文件。 个对象的输入文件 用一台其内存至多可容纳750个对象 内存至多可容纳 个对象的计 用一台其内存至多可容纳750个对象的计 算机对该文件进行排序。输入文件放在磁 算机对该文件进行排序。 盘上,磁盘每个页块可容纳250个对象 每个页块可容纳 个对象, 盘上,磁盘每个页块可容纳250个对象, 250= 这样全部对象可存储在 4500 / 250=18 个 页块中。输出文件也放在磁盘上,用以存 页块中。输出文件也放在磁盘上, 放归并结果。 放归并结果。
一、外排序的基本过程
• 当对象以文件形式存放于磁盘上的时候,通常 当对象以文件形式存放于磁盘上的时候, 是按物理块存储的。 是按物理块存储的。 • 物理块也叫做页块,是磁盘存取的基本单位。 物理块也叫做页块,是磁盘存取的基本单位。
• 每个页块可以存放几个对象。操作系统按 每个页块可以存放几个对象。 页块对磁盘上的信息进行读写。 页块对磁盘上的信息进行读写。 • 本节所指的磁盘是由若干片磁盘组成的磁 盘组, 盘组,各个盘片安装在同一主轴上高速旋 转。各个盘面上半径相同的磁道构成了柱 各盘面设置一个读写磁头, 面。各盘面设置一个读写磁头,它们装在 同一动臂上, 同一动臂上,可以径向从一个柱面移到另 一个柱面上。 一个柱面上。
硬盘简介 磁盘的主要技术指标 柱面:多个盘片的同一磁道。 柱面:多个盘片的同一磁道。 目前常见的硬盘容量有 6.2GB、10GB、20GB、 、 、 、 40GB、60GB、80GB等等。 、 等等。 、 等等
第11章 章
外部排序
外排序: 外排序: 在排序过程中必须不断地在内存与 外存之间传送数据, 外存之间传送数据,这种基于外部存储 设备(或文件)的排序技术就是外排序。 设备(或文件)的排序技术就是外排序。
R1
R2
R3
R4
R5
R6
R7
R8
R9
R10
R1’
R2’
R3’
R4’
R5’
R1’’
R2’’
R3’’
R1’’’ 有序文件
R2’’’
假设在上例中每个物理块可以容纳200个 假设在上例中每个物理块可以容纳200个 200 记录,则每一趟归并需进行50 50次 记录,则每一趟归并需进行50次“读” 和“写”,4趟归并加上内部排序时所需 进行的读/写使得在外排序中进行500 500次 进行的读/写使得在外排序中进行500次 的读/ 的读/写。
• 为了访问某一页块,先寻找柱面, 为了访问某一页块,先寻找柱面, 移动臂使读写磁头移到指定柱面上: 移动臂使读写磁头移到指定柱面上: (seek)。 寻查 (seek)。 • 再根据磁道号(盘面号)选择相应读 再根据磁道号(盘面号) 写磁头, 写磁头,等待指定页块转到读写磁 头下:等待(latency)。因此, 头下:等待(latency)。因此, 在磁盘 组上存取一个页块的时间: 组上存取一个页块的时间:
两路归并排序的归并
初始 归并段 第一趟 归并结果 第二趟 归并结果 第三趟 归并结果
R1 750 R2 750 R3 750 R4 750 R5 750 R6 750
R12
1500
R34
1500
R56
1500
R1234
3000
R123456
4500
• 由于内存中可用于排序的存储区域能容 个对象, 因此内存中恰好能存3 纳750 个对象, 因此内存中恰好能存3个页 块的对象。 块的对象。 • 在外归并排序一开始,把18块对象,每3 在外归并排序一开始, 18块对象, 块对象 块一组,读入内存。 块一组,读入内存。利用某种内排序方 法进行பைடு நூலகம்排序, 形成初始归并段, 法进行内排序, 形成初始归并段, 再写回 外存。总共可得到6个初始归并段。 外存。总共可得到6个初始归并段。然后 一趟一趟进行归并排序。 一趟一趟进行归并排序。
当待排序的对象数目特别多时,在内存 当待排序的对象数目特别多时, 中不能一次处理。 中不能一次处理。必须把它们以文件的形式 存放于外存,排序时再把它们一部分一部分 存放于外存, 调入内存进行处理。 调入内存进行处理。
硬盘盘片组
硬盘构成
硬盘简介 盘片组由2 盘片组由2片、 3片、 5片、6片、8 11片 12片组成 片组成, 片、11片、12片组成,相邻片之间有 10 ~20 mm的空隙,以便悬臂磁头平行 mm的空隙 的空隙, 移动。磁盘两面都存有信息, 移动。磁盘两面都存有信息,顶部和底 部两面不存信息。读写数据时, 部两面不存信息。读写数据时,盘片高 速旋转,磁头沿着盘片径向移动。 速旋转,磁头沿着盘片径向移动。
• 第二个阶段把第一阶段生成的 初始归并段加以归并, 初始归并段加以归并,一趟趟 地扩大归并段和减少归并段个 数,直到最后归并成一个大归 并段(有序文件)为止。 并段(有序文件)为止。
例:
• 假设有一个含10000个记录的文件,首先 假设有一个含10000个记录的文件, 10000个记录的文件 通过10次内部排序得到10 10次内部排序得到10个初始归并段 通过10次内部排序得到10个初始归并段 R1~R10,其中每一段都含1000个记录。 1000个记录 R1~R10,其中每一段都含1000个记录。 然后对它们作如下图所示的两两归并, 然后对它们作如下图所示的两两归并, 直至得到一个有序文件为止。 直至得到一个有序文件为止。
• trw
:是数据传送时间,是传送一个页 是数据传送时间, 块数据所需的时间。 块数据所需的时间。
基于磁盘进行的排序多使用归并排 序方法。其排序过程主要分为两个阶段: 序方法。其排序过程主要分为两个阶段:
第一个阶段: 第一个阶段: 建立用于外排序的内存缓冲区。 建立用于外排序的内存缓冲区。
根据它们的大小将输入文件划分为若干段, 根据它们的大小将输入文件划分为若干段, 用某种内排序方法对各段进行排序。 用某种内排序方法对各段进行排序。这些经过 (Run)。 排序的段叫做初始归并段或初始顺串 (Run)。 当它们生成后就被写到外存中去。 当它们生成后就被写到外存中去。
tio=tseek+tlatency+trw
tio=tseek+tlatency+trw
• tseek :是平均寻查时间,是把磁头定位 是平均寻查时间, 到要求柱面所需时间。 到要求柱面所需时间。
• tlatency :是平均等待时间,是将磁头 是平均等待时间,
定位到指定页块所需时间。 定位到指定页块所需时间。
物理块/页块 物理块 页块
200个记录 个记录
外部排序所需总的时间 =
内部排序(产生初始归并段) 内部排序(产生初始归并段)所需时间 m*tIS + 外存信息读写的时间d*t 外存信息读写的时间 IO + 内部归并所需的时间S*u*tmg 内部归并所需的时间
tES = m*tIS + d*tIO + S*u*tmg tIS tIO u*tmg m S d
是为得到一个初始归并段进行内部排序所需时 间的均值 是进行一次外存读/ 是进行一次外存读/写时间的均值 是对u 是对u个记录进行内部归并所需时间 为经过内部排序之后得到的初始归并段的个数 为归并的趟数 为总的读/ 为总的读/写次数
上例10000个记录中 个记录中 上例
m=10 d=500 s=4 u=10000