数据结构实验四概览

  • 格式:doc
  • 大小:160.50 KB
  • 文档页数:18

下载文档原格式

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

数据结构实验四

1.实验要求

置换-选择排序的实现

【问题描述】

对文件中的记录的关键字采用外部排序的置换-选择算法实现。

【实验要求】

设计置换-选择排序的模拟程序。

(1)记录存储在文件中。

(2)采用多路归并算法实现。

(3)采用置换-选择算法实现。

2实验描述

外部排序过程中,为了减少外存读写次数需要减小归并趟数(外部排序的过程中用到归并),外部排序1(其中k为归并路数,n为归并段的个数)。增加k和减小n都可以达到减小归并趟数的目的。置换-选择排序就是一种减小n的、在外部排序中创建初始归并段时用到的算法。它可以让初始归并段的长度增减,从而减小初始归并段的段数(因为总的记录数是一定的)。

置换-选择排序是在树形选择排序的基础上得来的,它的特点是:在整个排序(得到初始归并段)的过程中,选择最小(或最大)关键值和输入、输出交叉或并行进行。它的主要思路是:用败者树从已经传递到内存中的记录中找到关键值最小(或最大)的记录,然后将此记录写入外存,再将外存中一个没有排序过的记录传递到内存(因为之前那个记录写入外存后已经给它空出内存),然后再用败者树的一次调整过程找到最小关键值记录(这个调整过程中需要注意:比已经写入本初始归并段的记录关键值小的记录不能参见筛选,它要等到本初始段结束,下一个初始段中才可以进行筛选),再将此最小关键值记录调出,再调入新的记录.......依此进行指导所有记录已经排序过。内存中的记录就是所用败者树的叶子节点。开发环境:VC6.0。

3.置换-选择排序的实现

//A是从外存读入n个元素后所存放的数组

template

void replacementSelection(Elem * A, int n, const char * in, const char * out){ Elem mval; //存放最小堆的最小值

Elem r; //存放从输入缓冲区中读入的元素

FILE * iptF; //输入文件句柄

FILE * optF; //输出文件句柄

Buffer input; //输入buffer

Buffer output; // 输出buffer

//初始化输入输出文件

initFiles(inputFile, outputFile, in, out);

//初始化堆的数据,读入n个数据

initMinHeapArry(inputFile, n, A);

//建立最小值堆

MinHeap 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的记录

至少原来堆中的那些记录将成为顺串的一部分

最好情况下,如输入已经被排序,有可能一次就把整个文件生成为一个顺串

平均长度2M

文件保存,读取函数

#define MAXKEY INT_MAX

#define RUNEND_SYMBOL INT_MAX

#define w 6

#define M 10

#define N 24

typedef int KeyType; // 定义关键字类型为整型typedef int InfoType; // 定义其它数据项的类型

// 记录类型

typedef struct

{

KeyType key;

InfoType otherinfo;

}RedType;

typedef int LoserTree[w];

typedef struct

{

RedType rec;

KeyType key;

int rnum;

}RedNode, WorkArea[w];

主函数