位向量实现文件中数据排序

来源:互联网 发布:win7添加usb打印机端口 编辑:程序博客网 时间:2024/06/06 21:01
/*功能:利用位向量,排序文件中的整数*/

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
/*生成a至b之间的随机数*/
static int rand_int(int a,int b)
{
    return rand()%(b-a+1)+a;
}
/*交换a,b两数的值*/
static void swap(int *a,int *b)
{
    int tmp=*a;
    *a=*b;
    *b=tmp;
}
/*向文件中写入0-(n-1)之间的随机数*/
static void rand_write_file(FILE *f,int n)
{
    /*借助一个辅助数组*/
    int *arr=(int *)malloc(sizeof(int)*n);
    int i;
    for(i=0;i<n;i++){
        arr[i]=i;
    }
    for(i=0;i<n;i++){
        int index=rand_int(i,n-1);
        fprintf(f,"%d\n",arr[index]);
        swap(&arr[i],&arr[index]);/*关键步骤*/
    }
    free(arr);
}
/*将位向量中的第index位置1*/
static void set_bit(int *bits,int index)
{
    bits[index>>5] |= 1 << (index & 0x1F);
}
/*测试index位是否为1*/
static int test_bit(int *bits,int index)
{
    return bits[index>>5] & (1 << (index & 0x1F));
}
/*利用位向量,排序随机文件,并有序输出到另一个文件*/
static void sort_file(FILE *in_file,FILE *out_file,int n)
{
    int count=(n>>5)+1;
    int *bits=(int *)malloc(sizeof(int)*count);
    int i;
    for(i=0;i<count;i++)
        bits[i]=0;
    int index;
    while(fscanf(in_file,"%d",&index)!=EOF){
        set_bit(bits,index);
    }
    for(i=0;i<n;i++){
        if(test_bit(bits,i))
            fprintf(out_file,"%d\n",i);
    }
    free(bits);
}

int main(int argc,char *argv[])
{
    FILE *in_file,*out_file;
    in_file=fopen("in_file.txt","w+");
    out_file=fopen("out_file.txt","w");
    rand_write_file(in_file,10000000);
    fseek(in_file,0,SEEK_SET);
    clock_t start,end;
    start=clock();
    sort_file(in_file,out_file,10000000);
    end=clock();
    printf("The total times: %ds",(end-start)/CLOCKS_PER_SEC);
    fclose(in_file);
    fclose(out_file);
    return 0;
}
原创粉丝点击