编程珠玑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 .

 
posted @ 2013-03-12 17:10  mlj318  阅读(235)  评论(0编辑  收藏  举报