当前位置:首页 > 网络编程 > 软件语言 > C语言 > 磁盘分片归并排序函数

磁盘分片归并排序函数

点击次数:35 次 发布日期:2008-12-01 12:46:52 作者:源代码网
源代码网推荐 这是一个很老的的C函数,用来实现大的磁盘文件排序。在以前DOS操作系统下,对磁盘文件的排序一般有3种方法:1、将磁盘文件装入内存排序,将排序结果保存到新的文件,这适用于很小的(64K以内)、不需要经常索引的文件;2、对磁盘文件按关键字进行分块排序后,形成一个索引文件。块的大小一般为512K,常采用B+树或者B-数算法,这种方法适用于需要经常索引的磁盘文件,如DBF文件;3、把磁盘文件分片排序后,形成很多排序片文件,然后将这些排序片文件合并起来,输出为一个排序文件,这种方法适用于很大的、但又不需要经常索引的磁盘文件。
        可见,在DOS有限的内存条件下,磁盘文件分片归并排序是使用比较广泛的一种外存储器排序算法。现在计算机的物理内存一般足够大(最小的也有256MB吧),Windows的虚拟内存更是多达4个GB(对每一个应用程序而言),这对于很多磁盘文件的内存排序应该是足够了,况且现在的记录文件都放在各种数据库中,所以磁盘文件分片归并排序算法可能没有市场了(不过内存多路归并排序还是有市场的)。作为怀旧,把代码贴在这里,以免“失传”!


/**************************************************************************
*  文  件  名 : MERGE.H                                                   *
*  编  制  人 : 湖北省公安县统计局  毛 泽 发                              *
*  日      期 : 1991.8                                                    *
**************************************************************************/

#define S_IREAD         0x0100
#define S_IWRITE        0x0080

#if defined(__TINY__) || defined(__SMALL__) || defined(__MENIUM__)
#define SSIZE     25600    /* 排序缓冲区字节 */
#define NULL      0
#else
#define SSIZE     65024    /* 排序缓冲区字节 */
#define NULL      0L
#endif
#define MAXMERGE  4        /* 排序合并每趟每次最大片 */
#define MAXMEREC  (SSIZE / (MAXMERGE + 1)) /* 文件最大记录长 */

typedef int cdecl mercmpf(const void *, const void *); [Page]

/* 通用排序函数.
     参  数:排序文件名;原文件名;原文件头字节数;文件记录长;用户提供的比较函数.
     返回值:成功 > 0;内存不够.记录超长返回 0;文件操作出错 -1 */
int fmerge(char *foname, char *finame, int ftops, int lrd, mercmpf *cmpf);

 


/**************************************************************************
*  文  件  名 : MERGE.C                                                   *
*  编  制  人 : 湖北省公安县统计局  毛 泽 发                              *
*  日      期 : 1991.8                                                    *
**************************************************************************/

#include <io.h>
#include <string.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include "merge.h"

static mercmpf *mercmp = NULL;   /* 比较函数 */

static char *merbuf = NULL;  /* 排序动态缓冲区 */ 源代码网供稿.
网友评论 (0)
会员中心
网络编程
本站推荐
网络编程之精华