数据结构-_外部排序
数据结构第八章_排序

49 38 65 97 76
三趟排序:4 13 27 38 48 49 55 65 76 97
算法描述
#define T 3 int d[]={5,3,1};
例 13 48 97 55 76 4 13 49 27 38 65 49 27 38 65 48 97 55 76 4 j j j
j
j
i
例 初始: 49 38 65 97 76 13 27 48 55 4 取d1=5 49 38 65 97 76 13 27 48 55 4 一趟分组:
一趟排序:13 27 48 55 4 取d2=3 13 27 48 55 4 二趟分组:
49 38 65 97 76 49 38 65 97 76
二趟排序:13 4 48 38 27 49 55 65 97 76 取d3=1 13 27 48 55 4 三趟分组:
初始时令i=s,j=t
首先从j所指位置向前搜索第一个关键字小于x的记录,并和rp
交换 再从i所指位置起向后搜索,找到第一个关键字大于x的记录, 和rp交换 重复上述两步,直至i==j为止 再分别对两个子序列进行快速排序,直到每个子序列只含有 一个记录为止
快速排序演示
算法描述
算法评价
例
38 49 49 38 65 76 97 13 97 76 97 27 13 30 97 27 97 30 初 始 关 键 字
38 49 65 13 76 27 76 13 30 76 27 76 30 97 第 一 趟
38 49 13 65 27 65 13 30 65 27 65 30
38 13 49
时间复杂度
最好情况(每次总是选到中间值作枢轴)T(n)=O(nlog2n) 最坏情况(每次总是选到最小或最大元素作枢轴)
数据结构名词解释

数据结构:是一门研究非数值计算的程序设计问题中计算机的操作对象以及它们之间的关系和操作等的学科.数据: 所有能输入到计算机中并被计算机程序处理的符号的总称.数据元素: 在计算机上程序中通常作为一个整体进行考虑和处理.数据对象: 是性质相同的数据元素的集合,是数据的一个子集.数据类型: 一个值的集合和定义在这个值集上的一组操作的总称.线性表: 最常用却最简单的一种数据结构.栈:限定仅在表尾进行插入或删除操作的线性表. 栈顶:线性表尾端(表尾端)栈底:线性表头端(表头端)空栈:不含元素的空表. 队列:一种先进先出的线性表.队尾:在队列中,允许插入的一端.队头:在队列中.允许删除的一端.根的结点:在任意一棵非空树中,有且仅有一个特定的.结点的度:结点拥有的子树数.叶子: 度为0的结点.树的度: 树内各结点的度的最大值.非终端结点:度不为零的结点.孩子:结点的子树的根.双亲:该结点称为孩子的双亲.兄弟:同一个双亲的孩子之间.堂兄弟:双亲在同一层的结点.祖先:从根到该结点所经分支上的所有结点.孙子:以某结点为根的子树中的任一结点都称为该结点的孙子.树的深度:树中结点的最大层次.结点的层次:从根开始定义起,根为第一层,根的孩子为第二层.有序树:如果将树中结点的各子树看成从左到右是有次序的,就.....(即不能互换).无序树:(见有序树),否则称为无序树.森林:是m棵互不相交的树的集合.二叉树:是结点的有限集合,它可以为空,也可以是由一根结点和称为根的左右子树的两棵子树组成.满二叉树:一棵深度为k具有2k-1(应该是2的k次方再减1)结点的二叉树.完全二叉树:深度为K的,有n个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对应时.图:是一种较线性表和树更为复杂的数据结构.有向图/无向图:设VR是两个顶点之间的关系的集合,若<v,w>∈VR,则<v,w>表示从v到w的一条弧,此时的图称为有向图,/若<v,w>∈VR必有<w,v>∈VR,即VR是对称的,表示v和w之间的一条边,此时的图称为无向图.子图:假设有两个图G=(V,{E})和G'=(V',{E'}),如果V'包含于V且E'包含于E,则称G'为G的子图.完全图:有n(n-1)/2条边的无向图.邻接结点:孤立点:孤点的度:入度:对于有向图,以某顶点为弧头的弧的数目为该顶点的入度出度:以某顶点为弧尾的弧的数目为该顶点的出度路径:从树中一个结点到另一个结点之间的分支就构成这两个结点之间的路径路径长度:路径上经过的边或弧的数目叫路径长度回路:若一条路径上开始点和终止点相同则称此路径为回路。
数据结构第7章排序

7.2.1 冒泡排序
• 排序过程 – 将第一个和第二个元素的关键字进行比较,若为逆序 ,则将两个元素互换;接着比较第二个和第三个元素 的关键字,依次类推,直至最后两个元素的完成比较 ,这称为第一趟冒泡排序。第一趟排序分划出一组元 素个数为n-1的待排序列和一个关键字最大的元素。 – 第i趟对前n - i + 1个的元素进行类似的排序操作,得到 一组元素个数为n - i的待排序列和一个(在前n-i+1个元 素中)关键字最大的元素。 – 这样不断分划直至一趟分划时无元素互换为止。
34 28 81 79 63 28 34 81 79 63 28 34 79 81 63
第一趟
28 34 79 63 81
第二趟
28 34 63 79 81
初始
7.2.1 冒泡排序
• 冒泡排序算法
template<class ElemType> void BubbleSort(ElemType data[], int n) { int lastSwapIndex = n - 1; //用于记录最后一次交换的元素下标 int i, j; for (i = lastSwapIndex; i > 0;i = lastSwapIndex){ lastSwapIndex = 0; for (j = 0; j < i; j++) if (data[j] > data[j + 1]){ Swap(data[j],data[j + 1]); lastSwapIndex = j; } } }
数 据 结 构
第7章 排序
概述
• 什么是排序? – 排序是计算机内经常进行的一种操作,其目的是将一 组“无序”的元素序列调整为“有序”的元素序列。 – 假设含n个记录的序列为{ R1, R2, …, Rn },其相应的 关键字序列为 { K1, K2, …,Kn }。这些关键字相互之 间可以进行比较,即在它们之间存在着这样一个关系 : Kp1≤Kp2≤…≤Kpn (或≥) 按此关系将上面记录序列重新排列为: { Rp1, Rp2, …,Rpn } 的操作称作排序。
关于多路归并排序外部排序

关于多路归并排序外部排序⽐如⽂件内有1亿数据排序。
编程珠玑第⼀个case是有关⼀个技巧性解决外部排序问题的。
问题很巧妙的解决了,但⼀开始提到的利⽤归并排序进⾏外部排序的算法仍值得仔细探究⼀下,毕竟本科时学的不是很深⼊。
先来看内部排序中最简单的2路归并排序算法。
算法核⼼操作是将⼀维数组中前后相邻的两个有序序列归并为⼀个有序序列,给定数组中序列界限i、m、n,⽤2个下标变量分别从i和j=m+1开始逐个往后处理,先⽐较,⼩的写到结果序列的当前遍历下标k中,相应下标⾃增继续⽐较直到某个序列的下标⾛到边界,再将另外⼀个序列的剩余元素拷贝到结果序列中。
算法可⽤递归或递推实现,从相邻的两两元素开始不断调⽤上⾯的核⼼操作组成较长有序序列直到完成整个序列。
算法进⾏⼀趟归并就得到⼀个局部有序的完整新序列,n个元素共需要log2n趟归并,每趟完成⽐较操作n次(1次得到序列的1个值),得到的新序列写到结果序列空间中,下⼀趟之前要先将结果序列复制⼀份到临时空间,下⼀趟归并在临时空间上进⾏。
因此时间复杂度nlog2n,空间上除了原始序列空间n、结果序列空间n,还需要辅助临时空间n。
接下来看外部排序。
外部排序指的是⼤⽂件的排序,即待排序的记录存储在外存储器上,待排序的⽂件⽆法⼀次装⼊内存,需要在内存和外部存储器之间进⾏多次数据交换,以达到排序整个⽂件的⽬的。
外部排序最常⽤的算法是多路归并排序,即将原⽂件分解成多个能够⼀次性装⼊内存的部分,分别把每⼀部分调⼊内存完成排序。
然后,对已经排序的⼦⽂件进⾏多路归并排序。
多路归并排序算法在常见数据结构书中都有涉及。
从2路到多路(k路),增⼤k可以减少外存信息读写时间,但k个归并段中选取最⼩的记录需要⽐较k-1次,为得到u个记录的⼀个有序段共需要(u-1)(k-1)次,若归并趟数为s次,那么对n个记录的⽂件进⾏外排时,内部归并过程中进⾏的总的⽐较次数为s(n-1)(k-1),也即(向上取整)(logkm)(k-1)(n-1)=(向上取整)(log2m/log2k)(k-1)(n-1),⽽(k-1)/log2k随k增⽽增因此内部归并时间随k增长⽽增长了,抵消了外存读写减少的时间,这样做不⾏,由此引出了“败者树”treeof loser的使⽤。
严蔚敏《数据结构》(第2版)章节题库-第11章 外部排序【圣才出品】

第11章 外部排序一、选择题1.下列排序算法中,其中()是稳定的。
A.堆排序,起泡排序B.快速排序,堆排序C.直接选择排序,归并排序D.归并排序,起泡排序【答案】D2.若需在O(nlog2n)的时间内完成对数组的排序,且要求排序是稳定的,则可选择的排序方法是()。
A.快速排序B.堆排序C.归并排序D.直接插入排序【答案】C【解析】稳定排序有:插入排序、起泡排序、归并排序、基数排序。
不稳定排序有:快速排序、堆排序、shell排序。
时间复杂度平均为O(nlog2n)的有:归并排序、堆排序、shell排序、快速排序。
3.在下面的排序方法中,辅助空间为O(n)的是()。
A.希尔排序B.堆排序C.选择排序D.归并排序【答案】D4.下列排序算法中,占用辅助空间最多的是()。
A.归并排序B.快速排序C.希尔排序D.堆排序【解析】归并排序的辅助空间为O(n),快速排序所占用的辅助空间为O(logn),堆排序所占用的辅助空间为O(1)。
5.将两个各有N个元素的有序表归并成一个有序表,其最少的比较次数是()。
A.N B.2N-1 C.2N D.N-1【答案】A【解析】归并排序基本思想:归并排序是多次将两个或两个以上的有序表合并成一个新的有序表。
最简单的归并是直接将两个有序的子表合并成一个有序的表。
归并排序最好情况下的复杂度为O(n)。
6.从未排序序列中依次取出一个元素与已排序序列中的元素依次进行比较,然后将其放在已排序序列的合适位置,该排序方法称为()排序法。
A.插入B.选择C.希尔D.二路归并【答案】A【解析】解此题需要熟知各种排序方法的基本思想。
插入排序的基本思想是:假设待排序的记录存放在数组R[0..n-1]中,排序过程的某一中间时刻,R被划分成两个子区间R[0..i-1]和R[i..n-1],其中:前一个子区间是已排好序的有序区,后一个子区间则是当前未排序的部分,不妨称其为无序区。
将当前无序区的第1个记录R[i]插入到有序区R[0..i-1]中适当的位置上。
数据结构第十、十一章:排序

14
9.2 交换排序
冒泡排序
排序过程
将第一个记录的关键字与第二个记录的关键字进行比较, 将第一个记录的关键字与第二个记录的关键字进行比较,若 为逆序r[1].key>r[2].key,则交换;然后比较第二个记录与 为逆序 ,则交换; 第三个记录;依次类推,直至第n-1个记录和第 个记录比较 个记录和第n个记录比较 第三个记录;依次类推,直至第 个记录和第 为止——第一趟冒泡排序,结果关键字最大的记录被安置在 第一趟冒泡排序, 为止 第一趟冒泡排序 最后一个记录上 对前n-1个记录进行第二趟冒泡排序,结果使关键字次大的 个记录进行第二趟冒泡排序, 对前 个记录进行第二趟冒泡排序 记录被安置在第n-1个记录位置 记录被安置在第 个记录位置 重复上述过程,直到“ 重复上述过程,直到“在一趟排序过程中没有进行过交换记 录的操作” 录的操作”为止
按待排序记录所在位置
内部排序: 内部排序:待排序记录存放在内存 外部排序: 外部排序:排序过程中需对外存进行访问的排序
稳定排序和不稳定排序 假设Ki=Kj(1≤i≤n,1≤j≤n,i≠j),且在排序前的序列中Ri领先 假设 ( , , ),且在排序前的序列中 领先 ),且在排序前的序列中 于Rj(即i<j)。若在排序后的排序中Ri仍领先于 ,即那些具 ( )。若在排序后的排序中 仍领先于Rj, )。若在排序后的排序中 仍领先于 有相同关键字的记录,经过排序后它们的相对次序仍然保持不变, 有相同关键字的记录,经过排序后它们的相对次序仍然保持不变, 则称这种排序方法是稳定的;反之,若Rj领先于 ,则称所用的 则称这种排序方法是稳定的;反之, 领先于Ri, 领先于 方法是不稳定的。 方法是不稳定的。 按排序依据原则
4
例
外部排序

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路归并完毕
数据结构第29讲:第11章外部排序-c

归并段2: {10, 12, ∞}
归并段3: {29, 32, ∞}
归并段4: {15, 56, ∞}
17
05 冠军 (最小记录),
输出段1当前记录
15
选中 10
29
17
29
29 32
归并段3
15
15 56
归并段4
17 21
归并段0
05
05 44
归并段1
10
10 12
归并段2
1.产生“败者树” 2. 输出当前最小; 3. 调整(从叶到根);
用ls[1, 2, 3, 4, 5]指示内部结点 对应的外部结点;
ls0 4 ls1 1
输出: 05,10,12,15, 17,21,29,32, 44,56
0 ls2
2 ls3
ls4 3
b0 b1
b2
b3
b4 56
56
归并段0 归并段1
归并段2
归并段3
归并段4
i 0 1 2 3 4 567 89 ls0 ls1 ls2 ls3 ls4 b0 b1 b2 b3 b4
{ 17,21,05, }
{ 10,12,44 , }
{ 29,32,56 , }
29 12 32 29 ─ 32 ─ ─ 32 ───
───
输出文件 FO
MinMax MinMax
05 05 17 05 17 21 05 17 21 44 05 17 21 44 56 05 17 21 44 56
10 10 12 10 12 29 10 12 29 32 10 12 29 32
1. 从比MinMax大的关键字中选择最小的; 2. MinMax越来越大; 3. 当选不出新的MinMax时,当前归并段结束;
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1
5
2
3
5
9
4
5
6
7
5
7
29
9
输5
7
29
9
入 16
12
38
22
缓 49
25
57
47
52
84
66
48
冲
78
91
71
59
区
1234567 5 5 9 5 7 29 9
输5 出 缓 冲 区
注意:挑出冠军 需要进行 k-1 次 比较,此处需要 比较 3 次。 5
EXST
6 物料管理
3、多路平衡归并的实现
Algorithms and DataStructures:EXSORT
区
注意:挑出冠军
输
5
需要进行 k-1 次
出
比较,此处需要
缓
比较 3 次。
冲
区
7
EXST
8 物料管理
3、多路平衡归并的实现
Algorithms and DataStructures:EXSORT
tseck :找道时间 tla :等待时间 twm :传输时间/ 字符,n 字符数。
2
EXST
3 物料管理
2、外部排序的方法
Algorithms and DataStructures:EXSORT
1、步骤: • 生成合并段(run):读入文件的部分记录到内存 -> 在内存中进行内部排序 -> 将排好序的这些记录写入外存,形成合并段 -> 再读入该文件 的下面的记录,往复进行,直至文件中的记录全部形成合并段 为止。 7、15、19 8、11、13 16、23、31 5、12
便宜、可反复使用、是一种顺序存取设备。
查找费时、速度幔。
1
EXST
2 物料管理
1、外存信息的存取
3、常用外存: • 带文件的组织的改进:
块1
块2
Algorithms and DataStructures:EXSORT
块3
IBG(Inter Block Gap)块间间隙
B.F(块因子) = 一个物理记录包含逻辑记录的个数 带的利用率上升,如上例: •盘文件的位置:盘组号、柱面号、磁道号、块(扇区号) •盘文件的读写时间:T i/o = tseck + tla + n×twm
6
EXST
7 物料管理
3、多路平衡归并的实现
3、败者树及其使用
0
5
1
9
01
59
2
3
7
29
Algorithms and DataStructures:EXSORT
234567 7 29 5 7 29 9
4
5
6
7
5
7
29
9
输
5
7
29
9
入
16
12
38
22
缓
49
25
57
47
52
84
66
48
冲
78
91
71
59
2、胜者树及其使用 • 胜者进入下一轮,直至决出本次比赛的冠军。决出冠军之后,充分利用上一次比赛的 结果,使得更快地挑出亚军、第三名 …… 。 决出第一名需比较: k - 1 次 决出第二名需比较: log2k 次 决出第三名需比较: log2k 次
• 结果:采用胜者树后,从 K 个元素中挑选一个最小的元素仅需 log2k 次比 较,这时总的时间耗费下降为:
2、基本术语: • 记录(Record):数据项的集合存于内存,称之为结点。如果存之于外存,则叫做记 录。原因起源于是在历史上研究管理应用和计算机科学的两部分人 员的习惯。
• 域(场):记录中的每个数据项,称之为域(Field) 。 • 文件:记录的集合。 • 关键字:唯一标识记录的域,称之为关键字。 • 有序文件:文件根据关键字的大小。排成递增或递减的序列。 3、常用外存: • 磁带:由磁带介质、读、写磁头、驱动器、接收盘和原始盘组成。
EXST
4 物料管理
3、多路平衡归并的实现
Algorithms and DataStructures:EXSORT
1、带、盘的平衡多路归并的性质: logkm 趟 • e.g: K > 2 时, 趟数将会减少。m 个归并串。总共 n 个记录。
合并段 m
中间合并段
中间合并段
层数:
logkm +1
归并趟数:
logkm
有序文件
• 设从 k 个元素中挑选一个最小的元素需 ( k-1) 次比较。 每次比较耗费的时间代价为:
tmg,那么在进行 k 路平衡归并时,总的比较时间耗费不会超过:
logkm
× ( k - 1 ) × ( n - 1 ) × tmg = log2m / log2k × ( k - 1 ) × ( n - 1 ) × tmg
大
k
log2m / log2k × ( k - 1 ) 大
4
EXST
5 物料管理
3、多路平衡归并的实现
Algorithms and DataStructures:EXSORT
1、带、盘的平衡多路归并的性质:
• 改进:采用胜者树或者败者树,从 K 个元素中挑选一个最小的元素仅需 log2k 次比 较,这时总的时间耗费将下降: logkm × log2k × ( n - 1 ) × tmg = log2m × ( n - 1 ) × tmg
1 物料管理
1、外存信息的存取
Algorithms and DataStructures:EXSORT
1、外部排序:
内部排序:信息一次可全部调入内存,信息在内存中的处理时间是主要的时间耗费。
外部排序:信息量巨大,无法一次调入内存。只能驻留在带、盘。特点为内存运行时 间短,内、外存进行交换需要时间长。减少 I/O 时间成为主要矛盾。
• 归并趟数:
logkm where k 是路数;m 是初始合并段数。 如:m=6,那么 log26 = 3 而 log36 = 2 此外,还有一次生成所有合并段的时间。对 文件中的所有的记录全部读写一次。
每一趟归并时,对文件中的所有的记录都要全部读写一次。K 大,趟数减
少,读写记录的总数将减少。但 K 大,需要的内存将越多。 3
• 外部合并:将上一阶段生成的合并段调入内存,进行合并,直至最后形成一个有序的文
件。
• 平衡合并分类法:被合并的初始合并段均匀分布在 K 条磁带上,即分布在 T1、T2、 …… Tk 上。对这 K 条带进行合并,将生成的中间归并段分布在 TK+1、 TK+2 、…… T2K 上。然后,循环往复,直至最后形成一个 单一的合并段为止。
logkm × log2k × ( n - 1 ) × tmg = log2m × ( n - 1 ) × tmg 有意思的是该结果和 k 无关,这是通过多用空间换来的。
• 改进:采用胜者树,K 个元素中最小的元素输出之后,从根结点到它的相应的叶子结 点路径上的结点都需要进行修改,为了加快程序运行的速度产生了败者树。