第六章 外排序算法(2012)

合集下载

算法设计与分析C语言描述(陈慧南版)课后答案

算法设计与分析C语言描述(陈慧南版)课后答案

算法设计与分析C语⾔描述(陈慧南版)课后答案第⼀章15P1-3. 最⼤公约数为1。

快1414倍。

主要考虑循环次数,程序1-2的while 循环体做了10次,程序1-3的while 循环体做了14141次(14142-2循环)若考虑其他语句,则没有这么多,可能就601倍。

第⼆章32P2-8.(1)画线语句的执⾏次数为log n 。

(log )n O 。

划线语句的执⾏次数应该理解为⼀格整体。

(2)画线语句的执⾏次数为111(1)(2)16jnii j k n n n ===++=∑∑∑。

3()n O 。

(3)画线语句的执⾏次数为。

O 。

(4)当n 为奇数时画线语句的执⾏次数为(1)(3)4n n ++,当n 为偶数时画线语句的执⾏次数为 2(2)4n +。

2()n O 。

2-10.(1)当 1n ≥ 时,225825n n n -+≤,所以,可选 5c =,01n =。

对于0n n ≥,22()5825f n n n n =-+≤,所以,22582()n n n -+=O 。

(2)当 8n ≥ 时,2222582524n n n n n -+≥-+≥,所以,可选 4c =,08n =。

对于0n n ≥,22()5824f n n n n =-+≥,所以,22582()n n n -+=Ω。

(3)由(1)、(2)可知,取14c =,25c =,08n =,当0n n ≥时,有22212582c n n n c n ≤-+≤,所以22582()n n n -+=Θ。

2-11. (1) 当3n ≥时,3log log n n n <<,所以()20log 21f n n n n =+<,3()log 2g n n n n =+>。

可选 212c =,03n =。

对于0n n ≥,()()f n cg n ≤,即()(())f n g n =O 。

注意:是f (n )和g (n )的关系。

算法的时间复杂度和空间复杂度

算法的时间复杂度和空间复杂度

相关知识介绍(所有定义只为帮助读者理解相关概念,并非严格定义):1、稳定排序和非稳定排序简单地说就是所有相等的数经过某种排序方法后,仍能保持它们在排序之前的相对次序,我们就说这种排序方法是稳定的。

反之,就是非稳定的。

比如:一组数排序前是a1,a2,a3,a4,a5,其中a2=a4,经过某种排序后为a1,a2,a4,a3,a5,则我们说这种排序是稳定的,因为a2排序前在a4的前面,排序后它还是在a4的前面。

假如变成a1,a4, a2,a3,a5就不是稳定的了。

2、内排序和外排序在排序过程中,所有需要排序的数都在内存,并在内存中调整它们的存储顺序,称为内排序;在排序过程中,只有部分数被调入内存,并借助内存调整数在外存中的存放顺序排序方法称为外排序。

3、算法的时间复杂度和空间复杂度所谓算法的时间复杂度,是指执行算法所需要的计算工作量。

一个算法的空间复杂度,一般是指执行这个算法所需要的内存空间。

功能:选择排序输入:数组名称(也就是数组首地址)、数组中元素个数算法思想简单描述:在要排序的一组数中,选出最小的一个数与第一个位置的数交换;然后在剩下的数当中再找最小的与第二个位置的数交换,如此循环到倒数第二个数和最后一个数比较为止。

选择排序是不稳定的。

算法复杂度O(n2)--[n的平方void select_sort(int *x, int n){int i, j, min, t;for (i=0; i<n-1; i++) /*要选择的次数:0~n-2共n-1次*/{min = i; /*假设当前下标为i的数最小,比较后再调整*/for (j=i+1; j<n; j++)/*循环找出最小的数的下标是哪个*/{if (*(x+j) < *(x+min)){min = j; /*如果后面的数比前面的小,则记下它的下标*/}}if (min != i) /*如果min在循环中改变了,就需要交换数据*/{t = *(x+i);*(x+i) = *(x+min);*(x+min) = t;}}/*功能:直接插入排序输入:数组名称(也就是数组首地址)、数组中元素个数算法思想简单描述:在要排序的一组数中,假设前面(n-1) [n>=2] 个数已经是排好顺序的,现在要把第n个数插到前面的有序数中,使得这n个数也是排好顺序的。

C语言程序设计教案第6章21-24

C语言程序设计教案第6章21-24
选择排序以纸牌为例选择冒泡排序的执行过程,构造数据存储方式,通过动画与流程图展示算法设计思路,最后编程实现算法设计。指出两种排序的不同之处。
【问题】两种排序算法哪一种排序效率更高,高在什么地方?
6.2嵌套与递归设计与应用(0.5学时)
教学内容
(1)函数的嵌套。
(2)函数的递归设计与应用。
讲解思路
(1)函数的嵌套
二维数组作为函数参数:用实例来说明数组传递数据的重要作用。
【实践】编写程序实现(1)中的例题。
5.4模块化设计中程序代码的访问和应用实例(1学时)
教学内容
(1)模块化设计中程序代码的访问。
(2)应用实例。
讲解思路
(1)模块化设计中程序代码的访问举例说明用指针可以访问程序代码。
(2)应用实例。
计算器增加一个连续相加的功能。
(3)教师程序编写:让学生观摩程序的编写、运行及产生结果的过程,与知识点一一对应,加深理解。
(4)学生用手机C语言模拟器编写程序:题目与例题类似,但小有变化,让学生在设计中的错误。
(5)问答:就一些知识点的变化与学生进行问答互动。
(6)就(4)和(5)中同学们的表现给出部分平时分,为了鼓励同学们的参与积极性,答对者加2-3分。
(3)掌握模块间批量数据传递的方法,提高综合应用程序设计的能力。
重点:简单的排序算法、嵌套与递归设计与应用、模块间的批量数据传递。
难点:递归调用、学生成绩管理综合用例。
教学方法及手段
(1)课件:根据本节课程设计的内容及计划安,逐步展现知识点。
(2)板书:针对学生在学习和练习过程中出现的问题,进行补充讲解。调节课堂节奏,给学生思考的时间。
模块化设计中程序代码的访问
应用实例

排序有哪几种方法

排序有哪几种方法

排序有哪几种方法排序是计算机科学中非常重要的概念之一,它指的是将一组元素按照某种规则进行重新排列的过程。

排序算法可以分为多种类型,包括插入排序、交换排序、选择排序、归并排序、快速排序、堆排序、计数排序、桶排序、基数排序等。

下面我将详细介绍每种排序方法的原理、特点和应用场景。

1. 插入排序(Insertion Sort)插入排序是一种简单且直观的排序算法。

它的原理是将一个未排序的元素逐个地插入到已排序的部分中,最终形成一个完全有序的序列。

具体操作是从第二个元素开始,将其与前面已排序的元素逐个比较并插入到正确的位置。

插入排序的时间复杂度为O(n^2),适用于小规模或部分有序的序列。

2. 交换排序(Exchange Sort)交换排序包括冒泡排序和快速排序。

冒泡排序(Bubble Sort)的原理是从头到尾依次比较相邻的两个元素,如果顺序不对则交换位置,一轮下来可以将最大的元素移动到末尾。

快速排序(Quick Sort)使用了分治的思想,通过选择一个基准元素将序列分成左右两部分,左边的元素都小于该基准值,右边的元素都大于该基准值,然后递归地对左右两部分进行快速排序。

交换排序的平均时间复杂度为O(nlogn),适合用于排序大规模随机数据。

3. 选择排序(Selection Sort)选择排序的原理很简单:每一次从未排序的部分中选择最小(或最大)的元素,放到已排序部分的末尾。

具体操作是通过不断找到最小元素的索引,然后将其与第一个未排序元素交换,如此循环直到所有元素都被排序。

选择排序的时间复杂度为O(n^2),适用于简单的排序需求。

4. 归并排序(Merge Sort)归并排序采用了分治的思想,将一个序列递归地分成两个子序列,直到每个子序列只有一个元素,然后将两个有序的子序列合并成一个有序的序列。

具体操作是比较两个子序列的第一个元素,将较小的元素放入结果序列,然后再比较较小元素所在子序列的下一个元素与另一个子序列的第一个元素,直到所有元素都被放入结果序列。

算法设计第六章答案

算法设计第六章答案

2)程序流程 整个流程与队列式分支限界法的 01 背包问题一样,只是插入活结点的操作:由 insert()改为 push(),重新选择下一个扩展结点的操作:由 delete()改为 pop()。 算法主函数是: 一个 while(1)循环,循环结束条件是活结点列表为空,即当前扩展结点为空,表 示所有可行的结点都已经得到遍历;并且输出最优解。 每一次循环作用是:在当前的扩展结点下,将以当前扩展结点作为父结点的下一 层子结点都加入到活结点列表里,并且选择一个新的扩展结点,进入下一层循环; 其中,剪枝函数包括左结点的容量约束(约束函数)和右结点的最大价值判断(界 限函数);

将当前儿子结点加至 活结点列表
输出最优解 结束
将儿子结点加至活 结点列表
算法实现题 6-4: 最小重量机器设计问题 问题描述:设某一个机器由 n 个部件组成,每一种部件都可以从 m 个不同的供 应商处购得。设 wij 是从供应商 j 处购得的部件 i 的重量,cij 是相应的价格。 设计一个优先队列式分支限界法,给出总价格不超过 d 的最小重量机器设计。 编程任务: 对于给定的机器部件重量和机器部件价格,设计一个优先队列式分支限界法,计 算总价格不超过 d 的最小机器设计。
为 i+1; 2) 如果连接块 Nj 跨越 x[i+1]电路板,而且当前 high[j]小于 i+1,则将 high[j]更
新为 i+1; 3) 其余情况,则不需要更新 low[j]和 high[j]。
开始
根结点加入活结点列表, 并作为当前扩展结点
按照“先进先出”,选择下 一个扩展结点
计算各连接块的最小长度, 并且更新当前最优长度
算法流程: 主函数是一个 while 循环,结束条件是活结点列表为空,表示所有叶结点都已经 遍历完成;此时,应该输出整个问题的最优解。 每一次循环需要完成的工作包括:1)如果当前扩展结点的深度是 n-1,表示整个

外排序

外排序

外排所需总的时间为: 外排所需总的时间为:
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等等。 、 等等。 、 等等

DSA-6

DSA-6
2) 测试 l 和 r:若l < r,则转( 3 ),否则(l > r, 即 l = r+1 )转( 4 );
3) 交换:交换A[l]和A[r],转( 1 );(目的是使 l 和 r 都至少向其前 进方向前进一步)
4) 此时A[i],…A[j]被划分成为满足条件的两部分A[i],…A[l-1]和 A[l],…,A[j]。 3 应用技术学院 1 4 1 5 9 2 6 5 3
计算机专业基础课程 电子信箱:program_000@
}
应用技术学院
第 6 章 排序
Slide. 6 - 13
6.2 快速排序—划分交换排序
void QuickSort ( int i , int j ) 五、快速排序算法 /*对外部数组A 的元素A[i ],…,A[j]进行快速排序*/ { keytype pivot; int k; //关键字大于等于pivot的记录在序列中的起始下标 int pivotindex ; //关键字为pivot的记录在数组A中的下标 pivotindex = FindPivot ( i , j ); if( pivotindex != 0 ) { //递归终止条件 pivot=A[pivotindex].key; k=Partition ( i , j , pivot ); QuickSort ( i , k -1); QuickSort ( k , j ); } }//对数组A[1],…,A[n]进行快速排序可调用QuickSort(1,n)实现 计算机专业基础课程 电子信箱:program_000@ 应用技术学院
2)通过基准元素v 把表(文件,数据集合)划分成左、右两部分,使得 左边的各记录的关键字都小于v ;右边的各记录的关键字都大于 等于v;(如何划分?) 3)重复(1)~(2),分别对左边和右边部分递归的进行快速排序;

数据结构习题课(2012)

数据结构习题课(2012)

数据结构习题课(2012)复习重点1.数据结构的概念,逻辑结构、物理结构的概念及各⾃包含的内容2.算法的特性、设计要求,如何度量算法的时间效率。

3.线性表的顺序/链式存储结构的特点,插⼊、删除算法。

4.栈和队列的逻辑特性,顺序栈的⼊栈/出栈、循环队列的⼊队/出队算法。

5.以三元组顺序表存放的稀疏矩阵的转置算法。

6.⼆叉树的性质及其四种遍历算法。

7.森林与⼆叉树的相互转换。

8.WPL、前缀编码的概念,哈夫曼树的构造算法。

9.图的相关概念,邻接矩阵及邻接表的存储结构。

10.图的深度优先/⼴度优先遍历算法。

11.最⼩⽣成树的两种算法。

12.拓扑排序的意义和算法。

13.最短路径算法。

14.顺序表、有序表的查找算法。

15.⼆叉排序树的性质、插⼊/删除算法、平衡⼆叉树的性质、插⼊算法。

16.哈希表的相关概念,常⽤的冲突处理⽅法。

17.直接插⼊排序、希尔排序、快速排序、堆排序、归并排序的算法。

注意:1.上述每个知识点可能会以任何题型出现,复习的时候别把它们当做“简答题”来复习。

2.红⾊(下划线)标识的知识点或算法,只要求对给出的初始数据,能画出结果则可。

其他的算法则可能会出现在“算法题”中。

⾃测题第1章绪论⼀、判断1.顺序存储⽅式只能⽤于存储线性结构。

(错)2.顺序查找法适⽤于存储结构为顺序或链式存储的线性表。

(对)⼆、选择1.计算机算法必须具备输⼊、输出、( B )等5个特性。

A.可⾏性、可移植性和可扩展性B.可⾏性、确定性和有穷性C.确定性、有穷性和稳定性D.易读性、安全性和稳定性2.算法在发⽣⾮法操作时可以作出处理的特性称为(C )。

A.正确性B.易读性C.健壮性D.可靠性3.数据结构是⼀门研究⾮数值计算的程序设计问题中计算机的(A )以及它们之间的( B )和运算的学科。

A.操作对象B.计算⽅法C.逻辑存储D.数据映像A.结构B.关系C.运算D.算法4.在数据结构中,逻辑上数据结构可分为:(B )A.动态结构和静态结构B.线性结构和⾮线性结构C.紧凑结构和⾮紧凑结构D.内部结构和外部结构5.数据结构主要研究数据的(D )A.逻辑结构B.存储结构C.逻辑结构和存储结构D.逻辑结构和存储结构及其运算的实现6.为了描述n个⼈之间的同学关系,可⽤(C )结构表⽰A.线性表B.树C.图D.队列7.下⾯的程序段违反了算法的(A )原则void sam(){ int n=2;while (!odd(n)) n+=2;printf(n);}A.有穷性B.确定性C.可⾏性D.健壮性三、问答1.什么是逻辑结构和物理结构?各⾃包含哪⼏种?2.线性结构和树型结构的特点分别是什么?3.简述顺序存储结构与链式存储结构在表⽰数据元素之间关系上的只要区别。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
在初始归并段个数 m 与对象个数 u 一定时,
「log2m 」*(u-1) = const,而 (k-1) /「log2k」 在 k 增大时趋于无穷大。因此,增大归并路数 k,会使得 内部归并的时间增大。
k路平衡归并
使用“败者树”从 k 个归并段中选最小者,当 k 较大
时 (k ≥ 6),选出关键码最小的对象只需比较 「log2k」 次。 S*(u-1)*「log2k」 = 「logkm」 * (u-1) * 「log2k」 = 「log2m」 * (u-1) * 「log2k」 / 「log2k」 = 「log2m」 * (u-1) 关键码比较次数与 k 无关,总的内部归并时间不会 随 k 的增大而增大。 因此,只要内存空间允许, 增大归并路数 k, 将有效 地减少归并树深度, 从而减少读写磁盘次数 d, 提高 外排序的速度。
段得到 「m/2 」个归并段,以后各趟将从 t(t >1) 个归并段得到 「t/2」 个归并段。总归并趟 数等于归并树的高度-1,即为 「log2m」。
分 析
采用 2 路归并, 估计排序时间 tES 的上界为: 其中: tES是外部排序所需的总时间 tIS是为得到一个初始归并段进行内部排序所需时间
完成,输出一个段结束标志。
败者树的构建
败者树的高度为 「log2k」,在每次调整,找下一 个
具有最小关键码对象时, 最多做 「log2k」 次关键码 比较。 在内存中应为每一个归并段分配一个输入缓冲区,其 大小应能容纳一个页块的对象,编号与归并段号一致。 每个输入缓冲区应有一个指针,指示当前参加归并的 对象。 在内存中还应设立一个输出缓冲区,其大小相当于一 个页块大小。它也有一个缓冲区指针,指示当前可存 放结果对象的位置。每当一个对象 i 被选出,就执行 OutputRecord(i)操作,将对象按输出缓冲区指针所 指位置存放到输出缓冲区中。
败者树排序示例
(a) 初始状态
(b) 加入15, 29, 调整
(c) 加入10, 05, 调整
败者树排序示例
(d) 加入17, 调整

(e) 输出05后调整
(f) 输出10后调
败者树排序示例
(g) 输出12后调整 (h) 输出15后调整 (i) 输出17后调整
败者树排序示例
(j) 输出21后调整
败者树
待排对象数组 :
r = new Element[k]; 关键字(叶)结点数组: int *key = new int[k+1]; 败者树非叶结点数组: int *loser = new int[k];
败者树排序算法
1、初始化,输入记录及其关键字。 2、调整并建立败者树。 3、输出胜者(树根)。 4、输入新的记录(被输出归并段中的下一个 记录)。 5、调整败者树,重复3。
败者树调整算法
1. 找到新加入的叶子关键字数据的父结点。
2. 比较和父亲的关键字大小。 3. 如原败者(父亲)不变则继续向上比较,直
至根。 4. 如原败者比较后现为胜者,则将败者和该点 编号互换,重复2。
建立败者树
初始树中所有分支结点均记录败者为辅助最
大关键字Key[k]的标号k。 对每一个关键字叶子结点重复调用调整算法 ,直至树建立完成。
败者树
下面讨论利用败者树在 k 个输入归并段中选择最小
者,实现归并排序的方法。 败者树是一棵正则的完全二叉树。其中 (1) 每个叶结点存放各归并段在归并过程中当前 参加比较的对象; (2) 每个非叶结点记忆它两个子女结点中对象关 键码大的结点(即败者); 因此,根结点中记忆树中当前对象关键码最小的结 点 (最小对象)。
(k) 输出29后调整 (l) 输出32后调整
败者树排序示例
(m) 输出44后调整
(n) 输出56后调整, ∞升到loser[0]
k 路平衡归并排序算法:
void kwaymerge ( Element *r ) {
r = new Element[k]; //创建对象数组 int *key = new int[k+1]; //创建外结点数组 int *loser = new int[k]; //创建败者树数组 for ( int i = 0; i < k; i++ ) { //传送参选关键码 InputRecord ( r[i] ); key[i] = r[i].key; } for ( i = 0; i < k; i++) loser[i] = k;
活动头盘示意图
外存信息的存取
为了访问某一页块,先寻找柱面,移动臂使读写磁头
移到指定柱面上:寻查 (seek)。 再根据磁道号(盘面 号)选择相应读写磁头,等待指定页块转到读写磁头 下:等待(latency)。最后,读/写所需的信息。因此, 在磁盘组上存取一个页块的时间: Tio=tseek+tlatency+n*trw
分 析
由于 tIO = tseek + tlatency +trw, 其中,Tseek和tlatency
是机械动作,而trw、tIS、tmg是电子线路的动作, 所以 tIO >> tIS,tIO >> tmg。想要提高外排序的速 度,应着眼于减少 d。 若对相同数目的对象,在同样页块大小的情况下 做 2路归并、3 路归并或做 6 路归并(当然, 内存 缓冲区的数目也要变化),则可做大致比较: 上例中6个初始归并段的情况:
tES = m*tIS + d*tIO + S*u*tmg
的均值 m是经过内部排序之后得到的初始归并段的个数 tIO是进行一次外存读写时间的均值 d是总的读写次数 u*tmg是对u个记录进行内部归并所需的时间 S是归并的趟数
示 例
对4500个对象进行排序,各种操作的计算时间如下:
(1) 形成初始归并段:读18个输入块, 内部排序6段, 写18个输出块 =6 tIS+36 tIO (2) 第一趟归并:成对归并初始归并段 R1~R6 =36 tIO+4500 tmg (3) 第二趟归并:归并两个具有1500个对象的归并 段R12和R34 =24 tIO+3000 tmg (4)第三趟归并:最后将 R1234 和 R56 归并成一个 归并段 = 36 tIO+4500 tmg 合计 tES=6 tIS+132 tIO+12000 tmg
能一次处理。必须把它们以文件的形式存放 于外存,排序时再把它们一部分一部分调入 内存进行处理。这样,在排序过程中必须不 断地在内存与外存之间传送数据。这种基于 外部存储设备(或文件)的排序技术就是外 排序。
外存信息的存取
外存信息的存储——当对象以文件形式存放于
磁盘上的时候,通常是按物理块存储的。
其中:Tio:读写时间 tseek:寻查时间 tlatency:等待时间 trw:传输时间
外排序过程
基于磁盘进行的排序多使用归并排序方法。其排序
过程主要分为两个阶段: (1) 第一个阶段:建立用于外排序的内存缓冲区。 根据它们的大小将输入文件划分为若干段,用某种 内排序方法对各段进行排序。这些经过排序的段叫 做初始归并段或初始顺串 (Run)。当它们生成后就 被写到外存中去。 (2) 第二个阶段:仿照内排序中所介绍过的归并树 模式,把第一阶段生成的初始归并段加以归并,一 趟趟地扩大归并段和减少归并段个数,直到最后归 并成一个大归并段(有序文件)为止。
分 析
然后一趟一趟进行归并排序。两路归并排序
的归并树:
分 析
一般地,若总对象个数为 n,磁盘上每个页块
可容纳 b 个对象,内存缓冲区可容纳 i 个页块, 则每个初始归并段长度为 len = i * b,可生成 m = 「n / len」 个等长的初始归并段。
在做2路归并排序时,第一趟从 m 个初始归并
k路平衡归并
做 k 路平衡归并时,如果有 m 个初始归并段,则
相应的归并树有 「logkm」 +1 层,需要归并 「logkm」 趟。下图给出对有36个初始归并段的 文件做6路平衡归并时的归并树。
k路平衡归并
做内部 k 路平衡归并时,在 k 个对象中选择最小者,
需要顺序比较 k-1 次。每趟归并 u 个对象需要做(u1)*(k-1)次比较,S 趟归并总共需要的比较次数为: S*(u-1)*(k-1) = 「logkm」 * (u-1) * (k-1) = 「log2m 」* (u-1) * (k-1) / 「 log2k」
败者树
在实现利用败者树进行多路平衡归并算法时,把败
者树的叶结点和非叶结点分开定义。 树叶结点key[k+1]有k+1个,key[0]到key[k-1]存放 各归并段当前参加归并的对象的关键码,key[k]是 辅助工作单元,在初始建立败者树时使用,存放一 个最大的在各归并段中不可能出现的关键码: MaxNum。 败者树非叶结点loser[k]有k个,其中loser[1]到 loser[k-1]存放各次比较的败者的归并段号, loser[0]中是最后胜者所在的归并段号。另外还有一 个对象数组r[k],存放各归并段当前参加归并的对象。
示 例:
设有一个包含4500个对象的输入文件。现用一台其内
存至多可容纳750个对象的计算机对该文件进行排序。 输入文件放在磁盘上,设磁盘每个页块可容纳250个 对象,这样全部对象可存储在 4500 / 250=18 个页 块中。输出文件也放在磁盘上,用以存放归并结果。 分析: 由于内存中可用于排序的存储区域能容纳750 个对象, 因此内存中恰好能存3个页块的对象。 在外归并排序一开始,把18块对象,每3块一组,读 入内存。利用某种内排序方法进行内排序, 形成初始 归并段, 再写回外存。总共可得到6个初始归并段。
败者树
相关文档
最新文档