编程珠玑2中的习题

/*

 * Filename: 

 * Auther: mlj

 *第一章 第四题  产生0-n-1 之间k个随机顺序的随机整数

 * Create date: 2013/ 3/12

 */

 #include <stdlib.h> 

#include <stdio.h> 

#include<stdio.h>

#include <time.h>  

#define N 10000000

#define K 1000000



void swap(int *pm,int *pn)      /*必须用指针进行交换*/

{

   int temp;

   temp=*pm;

   *pm=*pn;

   *pn=temp;

}



int randint(l,u)

{

    return rand()%(u-l+1)+l;

}

int a[N];

int main(void)

{

    int   i;

    FILE *fp =NULL;

    fp = fopen("test.dat","wb"); 

    srand( (unsigned)time( NULL ) ); /*定义这个可以产生不同的随机数*/

    for(i=0;   i<N;   i++) {a[i]=i;}

    for(i=0;   i<K;   i++)

    {

     /* pa=&a[i]; pb=&a[rand()%i+1];*/

      swap(&a[i], &a[rand()%(N-i)+i]);     

      fwrite(&a[i],sizeof(int),1,fp);

      //printf("%d ",a[i] );

    }

    fclose(fp);     

}
int a[N]; 不能定义成局部变量,局部变量在栈区,大小有限。

/*

 * Filename: 

 * Auther: mlj

 *第一章 第3题  产生的k个 随机整数 排序

 * Create date: 2013/ 3/12

 */

 #include <stdlib.h> 

#include <stdio.h> 

#include<stdio.h>

#include <time.h>  

#define N 10000000

#define K 1000000



#define BITSPERWORD 32

#define SHIFT 5

#define MASK 0x1f

int a[1+N/BITSPERWORD];



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 intcomp(const void *a,const void *b)

{

    return *((int*)a) - *((int*)b);

}



int main(void)

{

    int   i;

    FILE *fp =NULL;

    float starttime = 0.0f;

    int *stream =(int*) malloc( sizeof(int)*K);

    int *p=NULL;

    fp = fopen("test.dat","rb"); 

    

    fread(stream,sizeof(int),K,fp) ;

    //printf("读文件耗时 %0.2f",clock()*0.001f-starttime);

    starttime = clock()*0.001f;

    for(i=0;   i<N;   i++) 

        clr(i);  

    for(i=0;   i<K;   i++)      

         set(*(stream+i)); 

    p = stream;

    for(i=0;   i<N;   i++)

    {

     /* pa=&a[i]; pb=&a[rand()%i+1];*/

      if(test(i))     

         *(p++) = i;

      //printf("%d ",a[i] );

    }

    printf("总耗时 %0.2f",clock()*0.001f-starttime);



    fseek(fp,0,SEEK_SET);

    fread(stream,sizeof(int),K,fp) ;

    starttime = clock()*0.001f;

    qsort(stream,K,sizeof(int),intcomp);

    printf("总耗时 %0.2f",clock()*0.001f-starttime);

    fclose(fp);     

    free(stream);

    return 0;

}

总耗时 0.10总耗时 0.17

C/位图0.1s  ,qsort 也才0.17s .

 

你可能感兴趣的:(编程珠玑)