/* * Heap sorting functions */ static _wsift(base, i, n, cmp) register int *base; register int i; register int n; register int (*cmp)(); { register int j, t; while((j = ((i << 1) + 1)) < n) { if((j < (n - 1)) && ((*cmp)((base+j), (base+j+1)) < 0)) ++j; if((*cmp)((base+i), (base+j)) < 0) { t = base[i]; base[i] = base[j]; base[j] = t; i = j; } else break; } } static _whsort(base, num, cmp) register int *base; register int num; register int (*cmp)(); { register int i, j; for(i = ((num >> 1) - 1); (i > 0); --i) _wsift(base, i, num, cmp); i = num; while(i > 1) { _wsift(base, 0, i--, cmp); j = *base; *base = *(base + i); *(base + i) = j; } } static _lsift(base, i, n, cmp) register long *base; register int i; register int n; register int (*cmp)(); { register int j; register long t; while((j = ((i << 1) + 1)) < n) { if((j < (n - 1)) && ((*cmp)((base+j), (base+j+1)) < 0)) ++j; if((*cmp)((base+i), (base+j)) < 0) { t = base[i]; base[i] = base[j]; base[j] = t; i = j; } else break; } } static _lhsort(base, num, cmp) register long *base; register int num; register int (*cmp)(); { register int i; register long j; for(i = ((num >> 1) - 1); (i > 0); --i) _lsift(base, i, num, cmp); i = num; while(i > 1) { _lsift(base, 0, i--, cmp); j = *base; *base = *(base + i); *(base + i) = j; } } static _nswap(pa, pb, n) register char *pa; register char *pb; register int n; { register char c; while(n--) { c = *pa; *pa++ = *pb; *pb++ = c; } } static _nsift(base, i, n, size, cmp) register char *base; register int i; register int n; register int size; register int (*cmp)(); { register int j; register char *p; while((j = ((i << 1) + 1)) < n) { p = (base+size*j); if((j < (n - 1)) && ((*cmp)(p, p+size) < 0)) { ++j; p += size; } if((*cmp)((base+size*i), p) < 0) { _nswap((base+size*i), p, size); i = j; } else break; } } static _nhsort(base, num, size, cmp) register char *base; register int num; register int size; register int (*cmp)(); { register int i, j; for(i = ((num >> 1) - 1); (i > 0); --i) _nsift(base, i, num, size, cmp); i = num; while(i > 1) { _nsift(base, 0, i--, size, cmp); _nswap(base, (base+size*i), size); } } hsort(base, num, size, cmp) char *base; int num; int size; int (*cmp)(); { if(size == 2) _whsort(base, num, cmp); else if(size == 4) _lhsort(base, num, cmp); else _nhsort(base, num, size, cmp); }