list sort( s, min, max )
list s;
typekey min, max;
{
int i;
typekey div, maxb[M], minb[M];
list head[M], t;
struct rec aux;
extern list Last;
if (s==NULL) return(s);
if (max==min) {
for (Last=s; Last->next!=NULL; Last = Last->next);
return( s );
}
div = (max-min) / M; /* Find dividing factor */
if (div==0) div = 1;
for (i=0; ik-min) / div;
if (i<0) i = 0; else if (i>=M) i = M-1;
t = s;
s = s->next;
t->next = head[i];
if (head[i]==NULL) minb[i] = maxb[i] = t->k;
head[i] = t;
if ( t->k > maxb[i] ) maxb[i] = t->k;
if ( t->k < minb[i] ) minb[i] = t->k;
}
/* sort recursively */
t = &aux;
for (i=0; inext = sort( head[i], minb[i], maxb[i] );
t = Last;
}
return(aux.next);
}
|