编程珠玑 第一章
题目:一个最多包含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])