double test(const int type, const int n) { assert(status==1); TimeStat clk(n); for (int j = 0; j < n; j++) { for (int i = 0; i < num; i++) data[i]=bk[i]; switch ((enum SORT_TYPE)type) { case HEAP2: clk.tic(); heapsort2(num,data); clk.toc(); break; case HEAP3: clk.tic(); heapsort3(num,data); clk.toc(); break; case HEAP4: clk.tic(); heapsort4(num,data); clk.toc(); break; //case MERGE: //clk.tic(); //mergesort(num,data); //clk.toc(); //break; case QUICK: clk.tic(); quicksort(num,data); clk.toc(); break; case QUICKNR: clk.tic(); quicksort_nr(num,data); clk.toc(); break; case QSORT: clk.tic(); qsort(data,num,sizeof(int),compare); clk.toc(); break; case STDSORT: clk.tic(); ::std::sort(data,data+num); clk.toc(); break; default: break; } } return clk.median(); }
float floatweightedmedian(int ndat, float *dat, float *weight) { int i; float sw,mw; float *a,*w,med; if(ndat==1) return dat[0]; if((a=(float*)malloc(sizeof(float)*ndat))==NULL) { fprintf(stderr,"Cannot allocate a in floatweightedmedian, ndat=%d\n", ndat); exit(-1); } if((w=(float*)malloc(sizeof(float)*ndat))==NULL) { fprintf(stderr,"Cannot allocate w in floatweightedmedian, ndat=%d\n", ndat); exit(-1); } memcpy(a,dat,sizeof(float)*ndat); memcpy(w,weight,sizeof(float)*ndat); /* sort */ heapsort2(ndat,a,w); /* sorted by dat */ sw=0; for(i=0;i<ndat;i++) sw+=w[i]; mw=0.5*sw; sw=0; med=0; for(i=0;i<ndat;i++) { sw+=w[i]; if(sw>mw) { med=a[i]; break; } else if(sw==mw) { med=0.5*(a[i]+a[i+1]); break; } } free(a); free(w); return med; /* error!! */ }