#include #include #include /* comments: 1. insertion sort sofort, nicht nachträglich 2. threshold = 16 */ static inline void iswap(void *a,void *b,size_t size) { register char *x=a; register char *y=b; register char *z=x+size; while (x1)) { char *min=base; char *tmp=min+size; for (i=1; i=0 && right<=1000); #endif if (nmemb<=8) { // --level; return isort(base,nmemb,size,compar); } { mid=(char*)base+(nmemb/2)*size; max=(char*)base+(nmemb-1)*size; if (compar(base,max)<0) /* a[left] < a[right] */ if (compar(base,mid)<0) /* a[left] < a[med] */ if (compar(max,mid)<0) /* a[left] < a[right] < a[med] */ v=max; else /* a[left] < a[med] < a[right] */ v=mid; else /* a[med] < a[left] < a[right] */ v=base; else /* a[right] < a[left] */ if (compar(base,mid)<0) /* a[right] < a[left] < a[med] */ v=base; else /* a[right] < a[left] && a[med] < a[left] */ if (compar(max,mid)<0) /* a[right] < a[med] < a[left] */ v=mid; else v=max; // printf("%d %d %d -> median %d\n",*(int*)base,*(int*)mid,*(int*)max,*(int*)v); } if (v != max) iswap(v,max,size); v=max; min=base; lmemb=0; for (;;) { while (__likely(compar(min,v)<0)) { min+=size; ++lmemb; } while (__likely(compar(max-=size,v)>0)) ; if (min>=max) break; iswap(min,max,size); } iswap(min,v,size); #ifdef DEBUG // { int i; for (i=0; i(char*)base+size) { #ifdef DEBUG assert(base==dbase); #endif // { int i; for (i=0; ilmemb+1) { // { int i; for (i=0; i0) if (j==l) break; if (i>=j) break; swap(base,size,i,j); if (compar(idx(base,size,i),v)==0) { ++p; swap(base,size,p,i); } if (compar(idx(base,size,j),v)==0) { --q; swap(base,size,q,j); } } swap(base,size,i,r); j=i-1; ++i; for (k=l; kq; --k,++i) swap(base,size,k,i); if (j>l) Qsort(base,nmemb,size,l,j,compar); if (r>i) Qsort(base,nmemb,size,i,r,compar); } void qsort(void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *)) { Qsort(base,nmemb,size,0,nmemb-1,compar); } #endif