位图排序

输入:一个文本文件最多包含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");
}

猜你喜欢

转载自blog.csdn.net/danxibaoxxx/article/details/84782874