编程珠玑 第一章

题目:一个最多包含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])

 

posted @ 2014-09-04 21:59  jdflyfly  阅读(148)  评论(0编辑  收藏  举报