#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=base+(nmemb/2)*size; max=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 (compar(min,v)<0) { min+=size; ++lmemb; } while (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; i