输入:一个文本文件最多包含n个正整数的字符串,每个数都小于n,逗号间隔,其中n=10000000, 没有重复的整数。
输出: 按升序排列这些数,并打印输出到另外一个文本文件中。格式也是逗号间隔、允许末尾有逗号。
约束:算法复杂度为O(N), 接口函数运行时申请内存或栈不超过2M。
对外提供的接口为:
int stat(const char *InFileName, const char *OutFileName);
该接口放在BitMapSort.h的头文件中。
BitMapSort.h
#ifndef _EXPR_LOG_H_
#define _EXPR_LOG_H_
int stat(const char *InFileName, const char *OutFileName);
#endif
BitMapSort.c
#include "BitMapSort.h"
#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#define BITSPERCHAR 8
#define N 10000000
#define BUFSIZE 1024
void BitMapSort(const char *InFileName, const char *OutFileName)
{
int in = open(InFileName, O_RDONLY);
int out = open(OutFileName,O_WRONLY|O_CREAT);
char datas[N/BITSPERCHAR] = {0};
char tmp[16] = {0};
char buffer[BUFSIZE];
int data = 0;
int i = 0;
if ((-1 == in) || (-1 == out))
{
return;
}
memset(datas,0,sizeof(datas));
while (read(in, buffer, BUFSIZE ) > 0)
{
for(i=0;i<strlen(buffer);i++)
{
if((',' == buffer[i]))
{
datas[data/8] |= (1 << (data%8));
/*printf("get:%d,%x\n",data,datas[data/8]);*/
data = 0;
continue;
}
data = data * 10 + (buffer[i] - '0');
}
}
datas[data/8] |= (1 << (data%8));
/*printf("get:%d,%x\n",data,datas[data/8]);*/
for(i=0;i< N;i++)
{
if(0 != (datas[i/8] & (1 << (i%8))) )
{
/*printf("%d,",i);*/
sprintf(tmp,"%d,",i);
write(out, tmp, strlen(tmp));
}
}
close(in);
close(out);
}
void main(void)
{
int fd = open("Data.txt",O_WRONLY|O_CREAT);
char *data = "1,2,3,4,34,42,64,5,67,8,96,342,123,34352,879";
write(fd, data, strlen(data));
close(fd);
BitMapSort("Data.txt","OutData.txt");
}