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;
}