如何给包含n个正整数的文件排序,其中每个整数只能出现一次,每个整数小于n n=10000000
可以用多趟排序,也可以用位向量 如果把空间严格限制为1MB那么可以用位向量+多趟排序
如果内存限制在1MB那么只要两趟排序即可,先排【0-5000000) 再排【5000000-10000000)即可
生成随机数程序:
#include <cstdio>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <time.h>
void inline swap(int &a, int &b){
int t = a;
a = b;
b = t;
}
int a[10000010];
int main(void){
freopen("w", "in.txt", stdout);
srand(time(0));
int n = 10000000;
int i;
for (i = 0; i < n; ++i)
{
a[i] = i;
}
for (i = 0; i < n; ++i)
{
int t = rand() % (n - i);
t = i + t;
swap(a[i], a[t]);
printf("%d\n", a[i]);
}
return 0;
}
用位向量进行排序的程序:
共需10秒左右
#include <cstdio>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <time.h>
#define BITSPERWORD 32
#define SHIFT 5
#define N 10000000
#define MASK 0x1f
int a[N / BITSPERWORD + 1];
void set(int i){
a[i>>SHIFT] |= (1<<(i & MASK));
}
int test(int i){
return a[i>>SHIFT] & (1<<(i & MASK));
}
int main(void){
freopen("in.txt", "r", stdin);
freopen("out.txt", "w", stdout);
int i;
int n = 10000000;
for (i = 0; i < n; ++i)
{
int t;
scanf("%d", &t);
set(t);
}
for (i = 0; i < n; ++i)
{
if(test(i))
printf("%d\n", i);
}
fclose(stdin);
fclose(stdout);
return 0;
}