您的位置:首页 > 编程语言

编程珠玑 第一章

2014-09-04 21:59 155 查看
题目:一个最多包含n个正整数的文件,每个数都小于n,其中n=10^7,且所有正整数都不重复。求如何将这n个正整数升序排列。

约束:最多有1MB的内存空间可用,有充足的磁盘存储空间。

习题2 习题3 实现位向量用于排序。

#include<stdio.h>

#define N 10000000
#define Shift 5
#define BitPerWord (sizeof(int)*8)
#define Mask ((1<<Shift)-1)

int a[1+N/BitPerWord];

void set(int i){
a[i>>Shift] |= 1<<(i&Mask);
}

void clr(int i){
a[i>>Shift] &= ~(1<<(i&Mask));
}

int test(int i){
return a[i>>Shift] & (1<<(i&Mask));
}

int main(){
freopen("data.in","r",stdin);
freopen("data.out","w",stdout);
for(int i=0;i<N;i++)
clr(i);
int a;
while(scanf("%d",&a)!=EOF)
set(a);
for(int i=0;i<N;i++){
if(test(i))
printf("%d ",i);
}
printf("\n");

return 0;
}


习题4:返回0至n-1之间的k个不同的随即顺序的随机整数。

for i = [0,n)
x[i]=i

for i = [0,k)
swap(i,rand(i,n-1))
print(x[i])
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: