数据结构实验四讲解.doc

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
数据结构实验四讲解

第  PAGE 18 页 共 21 页 数据结构实验四 实验要求 置换-选择排序的实现 【问题描述】 对文件中的记录的关键字采用外部排序的置换-选择算法实现。 【实验要求】 设计置换-选择排序的模拟程序。 (1)记录存储在文件中。 (2)采用多路归并算法实现。 (3)采用置换-选择算法实现。 2实验描述 外部排序过程中,为了减少外存读写次数需要减小归并趟数(外部排序的过程中用到归并),外部排序1(其中k为归并路数,n为归并段的个数)。增加k和减小n都可以达到减小归并趟数的目的。置换-选择排序就是一种减小n的、在外部排序中创建初始归并段时用到的算法。它可以让初始归并段的长度增减,从而减小初始归并段的段数(因为总的记录数是一定的)。 置换-选择排序是在树形选择排序的基础上得来的,它的特点是:在整个排序(得到初始归并段)的过程中,选择最小(或最大)关键值和输入、输出交叉或并行进行。它的主要思路是:用败者树从已经传递到内存中的记录中找到关键值最小(或最大)的记录,然后将此记录写入外存,再将外存中一个没有排序过的记录传递到内存(因为之前那个记录写入外存后已经给它空出内存),然后再用败者树的一次调整过程找到最小关键值记录(这个调整过程中需要注意:比已经写入本初始归并段的记录关键值小的记录不能参见筛选,它要等到本初始段结束,下一个初始段中才可以进行筛选),再将此最小关键值记录调出,再调入新的记录依此进行指导所有记录已经排序过。内存中的记录就是所用败者树的叶子节点。开发环境:VC6.0。 3.置换-选择排序的实现 //A是从外存读入n个元素后所存放的数组 template class Elem void replacementSelection(Elem * A, int n, const char * in, const char * out){ Elem mval; //存放最小堆的最小值 Elem r; //存放从输入缓冲区中读入的元素 FILE * iptF; //输入文件句柄 FILE * optF; //输出文件句柄 BufferElem input; //输入 buffer BufferElem output; // 输出buffer //初始化输入输出文件 initFiles(inputFile, outputFile, in, out); //初始化堆的数据,读入n个数据 initMinHeapArry(inputFile, n, A); //建立最小值堆 MinHeapElem H(A, n, n); //初始化inputbuffer,读入部分数据 initInputBuffer(input, inputFile); for(int last = (n-1); last = 0;){ mval = H.heapArray[0]; //堆的最小值 sendToOutputBuffer(input,output,iptF,optF, mval); input.read(r); //从输入缓冲区读入一个记录 if(!less(r, mval)) H.heapArray[0] = r; else {//否则用last位置记录代替根结点,把r放到last H.heapArray[0] = H.heapArray[last]; H.heapArray[last] = r; H.setSize(last); last--; } if (last!=0) H.SiftDown(0); } endUp(output,inputFile,outputFile); } 4详细设计 设计思想: 1. 初始化最小堆:目的是提高RAM中排序的效率 (a) 从缓冲区读M个记录放到数组RAM中 (b)?设置堆尾标志:LAST = M - 1 (c)?建立一个最小值堆 2.?重复以下步骤,直至堆空(结束条件)(即LAST 0) (a) 把具有最小关键码值的记录(根结点)送到输出缓冲区 (b)设R是输入缓冲区中的下一条记录 1. 如0果R的关键码不小于刚输出的关键码值,则把R 放到根结点 2. 否则,使用数组中LAST位置的记录代替根结点, 然后把R放到LAST位置。设置LAST = LAST-1 (c)重新排列堆,筛出根结点 算法结束后,RAM中也填满了不能处理的数据,直接建成堆,留待下一顺串来处理 大小是M的堆,最小顺串的长度为M的记录 至少

文档评论(0)

shuwkb + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档