`
gaofen100
  • 浏览: 1188805 次
文章分类
社区版块
存档分类
最新评论

数据结构 外部排序 多路归并排序

 
阅读更多
(1)代码如下:
merge.c
#include "c1.h"
#include "c2.h"
#include "stdio.h"
#include "stdlib.h"
#include "string.h"

/* k路归并 */
#define k 3

/* 设输出M个数据换行 */
#define M 10

/* k+1个文件指针(fp[k]为大文件指针),全局变量 */
FILE *fp[k + 1];

/* 败者树是完全二叉树且不含叶子,可采用顺序存储结构 */
typedef int LoserTree[k];

typedef int ExNode, External[k+1];

/* 全局变量 */
External b;

/* 从第i个文件(第i个归并段)读入该段当前第1个记录的关键字到外结点 */
int input(int i, KeyType *a){
int j = fscanf(fp[i], "%d ", a);
if(j > 0){
printf("%d/n", *a);
return 1;
}else{
return 0;
}
}

/* 将第i个文件(第i个归并段)中当前的记录写至输出归并段 */
void output(int i){
fprintf(fp[k], "%d ", b[i]);
}

/* 沿从叶子结点b[s]到根结点ls[0]的路径调整败者树。*/
void Adjust(LoserTree ls, int s){
int i, t;

/* ls[t]是b[s]的双亲结点 */
t = (s + k) / 2;
while(t > 0){
/* s指示新的胜者 */
if(b[s] > b[ls[t]]){
i = s;
s = ls[t];
ls[t] = i;
}
t = t / 2;
}
ls[0] = s;
}

/**
* 已知b[0]到b[k-1]为完全二叉树ls的叶子结点,存有k个关键字,沿从叶子
* 到根的k条路径将ls调整成为败者树。
*/
void CreateLoserTree(LoserTree ls){
int i;
b[k] = MINKEY;

/* 设置ls中“败者”的初值 */
for(i = 0; i < k; ++i){
ls[i] = k;
}

/* 依次从b[k-1],b[k-2],…,b[0]出发调整败者 */
for(i = k - 1; i >= 0; --i){
Adjust(ls, i);
}
}

/**
* 利用败者树ls将编号从0到k-1的k个输入归并段中的记录归并到输出归并段。
* b[0]至b[k-1]为败者树上的k个叶子结点,分别存放k个输入归并段中当前记录的关键字。
*/
void K_Merge(LoserTree ls, External b){
int i, q;

/* 分别从k个输入归并段读人该段当前第一个记录的关键字到外结点 */
for(i = 0; i < k; ++i) {
input(i, &b[i]);
}

/* 建败者树ls,选得最小关键字为b[ls[0]].key */
CreateLoserTree(ls);

while(b[ls[0]] != MAXKEY){
/* q指示当前最小关键字所在归并段 */
q = ls[0];

/* 将编号为q的归并段中当前(关键字为b[q].key)的记录写至输出归并段 */
output(q);

/* 从编号为q的输入归并段中读人下一个记录的关键字 */
if(input(q, &b[q]) > 0){
/* 调整败者树,选择新的最小关键字 */
Adjust(ls,q);
}
}

/* 将含最大关键字MAXKEY的记录写至输出归并段 */
output(ls[0]);
}

void show(KeyType t) {
printf("(%d)", t);
}

void main(){
KeyType r;
int i, j;
char fname[k][4], fout[5] = "out", s[3];
LoserTree ls;

/* 依次打开f0,f1,f2,…,k个文件 */
for(i = 0; i < k; i++){
/* 生成k个文件名f0,f1,f2,… */
itoa(i, s, 10);
strcpy(fname[i], "f");
strcat(fname[i], s);

/* 以读的方式打开文件f0,f1,… */
fp[i] = fopen(fname[i], "r");
printf("有序子文件f%d的记录为:/n",i);

/* 依次将f0,f1,…的数据读入r */
do{
j = fscanf(fp[i], "%d ", &r);
/* 输出r的内容 */
if(j == 1){
show(r);
}
}while(j == 1);
printf("/n");

/* 使fp[i]的指针重新返回f0,f1,…的起始位置,以便重新读入内存 */
rewind(fp[i]);
}

/* 以写的方式打开大文件fout */
fp[k] = fopen(fout, "w");

/* 利用败者树ls将k个输入归并段中的记录归并到输出归并段,即大文件fout */
K_Merge(ls, b);

/* 关闭文件f0,f1,…和文件fout */
for(i = 0; i <= k; i++){
fclose(fp[i]);
}

/* 以读的方式重新打开大文件fout验证排序 */
fp[k] = fopen(fout, "r");
printf("排序后的大文件的记录为:/n");

i = 1;
do{
/* 将fout的数据读入r */
j = fscanf(fp[k], "%d ", &r);

/* 输出r的内容 */
if(j == 1){
show(r);
}

/* 换行 */
if(i++ % M == 0){
printf("/n");
}
}while(j == 1);
printf("/n");

/* 关闭大文件fout */
fclose(fp[k]);
}

(2) c1.h
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define MINKEY -1
#define MAXKEY 100

/* Status是函数的类型,其值是函数结果状态代码,如OK等 */
typedef int Status;

/* Boolean是布尔类型,其值是TRUE或FALSE */
typedef int Boolean;

(3) c2.h
/* 一个用作示例的小顺序表的最大长度 */
#define MAXSIZE 20

typedef int KeyType;

(4) 测试数据
f0: 10 15 16 100
f1: 9 18 20 100
f2: 20 22 40 100
out: 9 10 15 16 18 20 20 22 40 100
分享到:
评论

相关推荐

    二路归并和多路归并排序PPT数据结构课件

    二路归并和多路归并排序PPT数据结构课件

    数据结构(C语言版)[严蔚敏]

    11.3 多路平衡归并的实现 11.4 置换一选择排序 11.5 最佳归并树 第12章 文件 12.1 有关文件的基本概念 12.2 顺序文件 12.3 索引文件 12.4 ISAM文件和VSAM文件 12.4.1 ISAM文件 12.4.2 VSAM文件 12.5 直接存取文件...

    《数据结构》(C语言版)严蔚敏

    11.3 多路平衡归并的实现 11.4 置换一选择排序 11.5 最佳归并树 第12章 文件 12.1 有关文件的基本概念 12.2 顺序文件 12.3 索引文件 12.4 ISAM文件和VSAM文件 12.4.1 ISAM文件 12.4.2 VSAM文件 12.5 直接存取文件...

    严蔚敏:数据结构题集(C语言版)

    11.3 多路平衡归并的实现 11.4 置换-选择排序 11.5 最佳归并树 第12章 文件 12.1 有关文件的基本概念 12.2 顺序文件 12.3 索引文件 12.4 ISAM文件和VSAM文件 12.4.1 ISAM文件 12.4.2 VSAM文件 12.5 直接存取文件...

    数据结构(C语言版)

    1.1 什么是数据结构 1.2 基本概念和术语 1.3 抽象数据类型的表现与实现 1.4 算法和算法分析 第2章 线性表 2.1 线性表的类型定义 2.2 线性表的顺序表示和实现 2.3 线性表的链式表示和实现 2.4 一元多项式的表示及相加...

    数据结构考研纲要

    (8)构造最佳归并树进行长度不等的归并段的多路平衡归并 (9)分为:1.磁盘文件排序:直接存取;2.磁带文件排序:顺序存取 (10)主要考虑访问磁盘次数;内部排序时间忽略不计 (11)总时间=内部排序时间+外存读写时间+内部...

    谭浩强C语言程序设计,C++程序设计,严蔚敏数据结构,高一凡数据结构算法分析与实现.rar

    3.9 多分支选择结构和switch语句 3.10 编写选择结构的程序 3.11 循环结构和循环语句 3.11.1 用while语句构成循环 3.11.2 用do-while语句构成循环 3.11.3 用for语句构成循环 3.11.4 几种循环的比较 3.12 循环的嵌套 ...

    [数据结构(C语言版)].严蔚敏_吴伟民.高清扫描版.rar

    11.3 多路平衡归并的实现 11.4 置换一选择排序 11.5 最佳归并树 第12章 文件 12.1 有关文件的基本概念 12.2 顺序文件 12.3 索引文件 12.4 ISAM文件和VSAM文件 12.4.1 ISAM文件 12.4.2 VSAM文件 12.5 直接存取文件...

    数据结构(C语言版)\Java数据结构和算

    7.5 归并排序 7.6 堆排序 7.7 多关键字排序 7.8 链表排序和索引表排序 7.9 内部排序小结 7.10 外部排序 7.11 参考文献和选读材料 第8章 Hash法 8.1 引言 8.2 静态Hash法 8.3 动态Hash法 8.4 Bloom滤波器 ...

    数据结构的上机作业答案

    实验1: 1)熟悉Vc 6.0环境 ...1) 以书中图11.4的数据,程序实现多路平衡归并排序。 2)以书中图11.5的数据,程序实现置换-选择排序。 实验12:文件 1)以书中图12.4的数据,程序实现顺序文件。

    数据结构与算法分析第二版 ---C语言描述(附加答案)

    排序7.1 预备知识7.2 插入排序7.2.1 算法7.2.2 插入排序的分析7.3 一些简单排序算法的下界7.4 希尔排序7.4.1 希尔排序的最坏情形分析7.5 堆排序7.5.1 堆排序的分析7.6 归并排序7.6.1 归并排序的分析7.7 快速排序...

    数据结构 c语言版

    11.3 多路平衡归并的实现 11.4 置换一选择排序 11.5 最佳归并树 第12章 文件 12.1 有关文件的基本概念 12.2 顺序文件 12.3 索引文件 12.4 ISAM文件和VSAM文件 12.4.1 ISAM文件 12.4.2 VSAM文件 12.5 直接...

    数据结构 上机作业答案

    实验1: 1)熟悉Vc 6.0环境 2)用两种算法实现1-1/...1) 以书中图11.4的数据,程序实现多路平衡归并排序。 2)以书中图11.5的数据,程序实现置换-选择排序。 实验12:文件 1)以书中图12.4的数据,程序实现顺序文件。

    数据结构与算法分析

     7.11.4 多路合并   7.11.5 多相合并   7.11.6 替换选择   小结   练习   参考文献  第8章 不相交集类   8.1 等价关系   8.2 动态等价性问题   8.3 基本数据结构   8.4 灵巧...

    数据结构与算法分析_Java语言描述(第2版)

    7.10.4 多路合并 7.10.5 多相合并 7.10.6 替换选择 小结 练习题 参考文献 第8章 不相交集类 8.1 等价关系 8.2 动态等价性问题 8.3 基本数据结构 8.4 灵巧求并算法 8.5 路径压缩 8.6 路径压缩和按秩求并的最坏情形 ...

    数据结构演示软件

    (1)多路平衡归并排序(K-Merge) (2)置换-选择排序(Repl_Selection) 三、 运行环境 1. 硬件:Pentium100以上PC机。 2. 软件:Windows95及以上版本的操作系统。 四、 运行 本系统的执行文件为DSDEMOW.EXE...

    谭浩强C语言程序设计,C++程序设计,严蔚敏数据结构,高一凡数据结构算法分析与实现.rar )

    3.9 多分支选择结构和switch语句 3.10 编写选择结构的程序 3.11 循环结构和循环语句 3.11.1 用while语句构成循环 3.11.2 用do-while语句构成循环 3.11.3 用for语句构成循环 3.11.4 几种循环的比较 3.12 循环的嵌套 ...

    数据结构的电子书(chm版)

    1、1 什么是数据结构 1、2 基本概念和术语 1、3 抽象数据类型的表示与实现 1、4 算法和算法分析 1、4、1 算法 1、4、2 算法设计的要求 1、4、3 算法效率的度量 1、4、4 算法的存储空间需求 2 线性表 2、1 线性表...

Global site tag (gtag.js) - Google Analytics