很多排序算法,插入排序、选择排序、归并排序等,这些算法都属于内部排序算法,排序的整个过程只是在内存中完成。而当待排序的文件比内存的可使用容量还大时,文件无法一次性放到内存中进行排序,需要借助于外部存储器(例如硬盘、U盘、光盘),这时要用到外部排序算法来解决。
外部排序算法由两个阶段构成:
1、按照内存大小,将大文件分成若干长度为l的子文件(l应小于内存的可使用容量),然后将各个子文件依次读入内存,使用适当的内部排序算法对其进行排序(排好序的子文件称为归并段或者顺段),将排好序的归并段重新写入外存,为下一个子文件排序腾出内存空间。
2、对得到的归并段进行合并,直至得到整个有序的文件为止。
/**
* 实验题目:
* 用败者树实现置换-选择排序算法
* 实验目的:
* 领会外排序中置换-选择排序算法的执行过程和算法设计
* 实验内容:
* 编写程序,模拟置换-选择算法生成初始归并段的过程以求解以下问题:
* 设磁盘文件中共有18个记录,记录的关键字序列为:(15, 4, 97, 64, 17, 32, 108,
* 44, 76, 9, 39, 82, 56, 31, 80, 73, 255, 68)
* 若内存工作区可容纳5个记录,用置换-选择排序可产生几个初始归并段,每个
* 初始归并段包含哪些记录?假设输入文件数据和输出归并段数据均放在内存中。
*/
#include <stdio.h>
#define MAX_SIZE 50 // 每个文件最多记录数
#define MAX_KEY 32767 // 最大关键字值∞
#define W 5 // 内存工作区可容纳的记录个数
typedef int key_type; // 定义关键字类型为整型
typedef int info_type; // 定义其他数据项的类型
typedef int loser_tree; // 败者树结点类型,它是完全二叉树且不含叶子,采用顺序存储结构
typedef struct
{
key_type key; // 关键字项
info_type other_info;