小代码
// //考虑到的BUG; //1: 输入指令不是-n或 -r //2: 输入了多次-n或-r //3:输入的指令参数个数大于2 //4:-n或-r后面跟的不是数字或是负数 //5:-n或-r后面可以跟带‘+’号的整数 // // #include<stdio.h> #include<stdlib.h> #include<unistd.h> #include<ctype.h> #include<time.h> #define N 2 bool isNum(char* s); int main(int argc,char * argv[]) { int ch; opterr=1; int count=-1; int scope=-1; int key=0; while((ch=getopt(argc,argv,"n:r:"))!=-1) { key++; if(!isNum(optarg)) { printf("非法参数\n"); return -1; } switch(ch) { case 'n': count=atoi(optarg); break; case 'r': scope=atoi(optarg); break; default: printf("参数解析错误!\n"); return -1; } } if(key!=N||count<0||scope<=0) { printf("参数解析错误!\n"); return -1; } srand((int)time(NULL)); for(int i=0;i<count;i++) { printf("%d\n",rand()%scope); } return 0; } bool isNum(char* s) { if(s==NULL) return false; char* p=s; if(*p=='+') p++; bool res=true; while(*p!='\0') { if(!isdigit(*p)) { res=false; } p++; } return res; }
#include<stdio.h> #include<stdlib.h> #include<pthread.h> #include<string.h> #include<unistd.h> #include<time.h> #define GROUP 10 int yy=10; int* tail[10]; typedef struct no { void* base; size_t num; size_t width; }node; int comp(const void *a,const void* b) { return *(int*)a-*(int*)b; } void *myq(void *n) { node* no=(node*)(n); qsort(no->base,no->num,no->width,comp); } void adjust_heap(int* p[],int n,int &yy) { int left=2*n+1; int right=2*n+2; if(n>=0&&n<yy/2) { int k=n; if(left<yy&&*p[left]<*p[k]) k=left; if(right<yy&&*p[right]<*p[k]) k=right; if(k!=n) { int *temp=p[n]; p[n]=p[k]; p[k]=temp; int* te=tail[n]; tail[n]=tail[k]; tail[k]=te; adjust_heap(p,k,yy); } } } void build_heap(int* p[]) { for(int i=yy/2-1;i>=0;i--) { adjust_heap(p,i,yy); } } int main() { int count=0; clock_t start,end,start1; start1 = clock(); int* num=(int *)malloc(sizeof(int)); int index=0; while(EOF!=scanf("%d",&num[index])) { num=(int*)realloc(num,sizeof(int)*(index+2)); getchar(); index++; count++; } num=(int*)realloc(num,sizeof(int)*(index+1)); if(count<10) { qsort(num,count,sizeof(int),comp); for(int i=0;i<count;i++) { printf("%d\n",num[i]); } return 0; } int k=count/GROUP; int tai=k; if(k*GROUP!=count) { tai=k+count-k*GROUP; } pthread_t t[10]; for(int i=0;i<9;i++) { node *n=(node*)malloc(sizeof(node)); n->base=num+(i*k); n->num=k; n->width=sizeof(int); pthread_create(&t[i],NULL,myq,n); } node n; n.base=num+9*k; n.num=tai; n.width=sizeof(int); pthread_create(&t[9],NULL,myq,&n); for(int i=0;i<10;i++) { pthread_join(t[i],NULL); } start = clock(); int* p[10]; for(int i=0;i<10;i++) { p[i]=num+(i*k); tail[i]=&num[(i+1)*k]; } tail[9]=num+count; build_heap(p); printf("\n"); for(int i=0;i<count;i++) { printf("%d\n",*p[0]); p[0]++; if(p[0]>=tail[0]) { int* temp=p[0]; p[0]=p[yy-1]; p[yy-1]=temp; int* t=tail[0]; tail[0]=tail[yy-1]; tail[yy-1]=t; yy--; } adjust_heap(p,0,yy); } end = clock(); printf("%lf\n",(double)(end - start)/CLOCKS_PER_SEC); printf("%lf\n",(double)(end - start1)/CLOCKS_PER_SEC); return 0; }