jetz
7/10/2013 - 4:29 AM

bitmap sort & rand generator <Programming Pearls>.

bitmap sort & rand generator .

#include <stdio.h>
#include <stdlib.h>

#define MAX 0x800000        //生成随机数的最大值 
#define SHIFT 5             //BITMAP位移
#define MASK 0x1F           //n为2的x次幂,m mod n = m & (n-1)

#define IN_PATH "rand_num.txt"
#define OUT_PATH "sorted_num.txt"

int main(int argc, const char *argv[]) {
    int temp;
    int a[MAX >> SHIFT] = {0};
    char ret;

    FILE *fp_in = fopen(IN_PATH,"r");
    if(fp_in == NULL){
        perror("FILE Open Failed");
        exit(EXIT_FAILURE);
    }
    while(!feof(fp_in)){
        fscanf(fp_in,"%d%c",&temp,&ret);
        a[temp >> SHIFT] |= 1 << (temp & MASK);
    }
    fclose(fp_in);


    FILE *fp_out = fopen(OUT_PATH,"w+");
    if(fp_out == NULL){
        perror("FILE Open Failed");
        exit(1);
    }
    for(int i = 0;i < MAX;i++){
        if(a[i >> SHIFT] & (1 << (i & MASK)))
            fprintf(fp_out,"%d%c",i,'\n');
    }
    fclose(fp_out);
    return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define MAX 0x800000        //生成随机数的最大值
#define SHIFT 5             //BITMAP位移
#define MASK 0x1F           //n为2的x次幂,m mod n = m & (n-1)

#define N 600000            //生成随机数的数目,太大建立数组会段错误

#define PATH "rand_num.txt"

void gen_rand(int n, int *result){
    int i = 0;
    int flags[MAX >> 5]={0};
    srand(time(NULL));
    while(i < N){
        int temp = rand() & (MAX-1);             //生成0~MAX-1范围的随机数
        if(flags[temp >> SHIFT] & (1 << (temp & MASK)))  //去重
            continue;
        else{
            result[i] = temp;
            flags[temp >>SHIFT] |= (1 << (temp & MASK)); //设置标记,为了去重判断
            i++;
        }
    }
}

int main(int argc, const char *argv[]) {
    int rand_nums[N];
    FILE *fp = fopen(PATH,"w+");
    if(fp == NULL){
        perror("Open File Error");
        exit(1);
    }
    gen_rand(N, rand_nums);
    for (int i = 0; i < N; i++)
        fprintf(fp, "%d\n", rand_nums[i]);
    fclose(fp);
    return 0;
}