#include #include #include int heapsort(void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *)) { ptrdiff_t i=1, j; void *tmp=malloc(size); base-=size; while(!(++i>nmemb)) { memcpy(tmp, base+(j=i)*size, size); while(j>1 && 0>1)*size, size))) j>>=1; memcpy(base+j*size, tmp, size); } while(--i>1) { memcpy(tmp, base+i*size, size); memcpy(base+i*size, base+(j=1)*size, size); do if(((j<<=1)+1)compar(base+j*size, base+(j+1)*size); while(jcompar(tmp, memcpy(base+(j>>1)*size, base+j*size, size))); memcpy(base+(j>>1)*size, tmp, size); } free(tmp); return(0); }