/* * 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 .