#include <cstdlib> #include <iostream> #include <windows.h> using namespace std; int comp(const void*a,const void*b) { return *(int*)a-*(int*)b; } bool good_order(const void *a ,const void *b) { return *((long long*)a) < *((long long*)b); } template <typename tp> void my_sort(tp a[],int s,bool good_order(const void* ,const void*)) { tp *c=new tp[s],*ic,*ib,*it=a-1,*endb,tem,*endc,*end=a+s; int h=1; const int csize=sizeof(a); while((it+=2)<end) { if(good_order(it,(it-1))) { tem=*it; *it=*(it-1); *(it-1)=tem; } } while((h<<=1)<s) { endb=a; endc=c+h; memcpy(c,a,csize); while((ib=endb+h)<end) { ic=c; it=endb; if((endb=ib+h)>end) endb=end; while(ic!=endc && ib!=endb) { if(good_order(ib,ic)) { *it = *ib; ++ib; } else { *it = *ic; ++ic; } ++it; } while(ic!=endc) *(it++) = *(ic++); } } delete c; } template <typename tp> void my_sort(tp a[],int s,bool good_order(const void* ,const void*),tp c[]) { tp *ic,*ib,*it=a-1,*endb,tem,*endc,*end=a+s; int h=1; const int csize=sizeof(a); while((it+=2)<end) { if(good_order(it,(it-1))) { tem=*it; *it=*(it-1); *(it-1)=tem; } } while((h<<=1)<s) { endb=a; endc=c+h; memcpy(c,a,csize); while((ib=endb+h)<end) { ic=c; it=endb; if((endb=ib+h)>end) endb=end; while(ic!=endc && ib!=endb) { if(good_order(ib,ic)) { *it = *ib; ++ib; } else { *it = *ic; ++ic; } ++it; } while(ic!=endc) *(it++) = *(ic++); } } } const int ARRAY_SIZE_=200000; int main() { srand((unsigned)GetTickCount()); long long *a=new long long[ARRAY_SIZE_],*b=new long long[ARRAY_SIZE_],t; int i; for(int t=101; --t;) { for(i=ARRAY_SIZE_; i;) { a[--i]=rand(); b[i]=rand(); } t=GetTickCount(); qsort(a,ARRAY_SIZE_,sizeof(long long),comp); qsort(b,ARRAY_SIZE_,sizeof(long long),comp); t=GetTickCount()-t; cout<<t<<endl; for(i=ARRAY_SIZE_; i;) { a[--i]=rand(); b[i]=rand(); } t=GetTickCount(); my_sort(a,ARRAY_SIZE_,good_order,b); my_sort(b,ARRAY_SIZE_,good_order,a); t=GetTickCount()-t; cout<<t<<endl<<endl; } }