sort( a, b )
int a, b;
{int i, j, rlow, rupp, wlow, wupp, InBuff;
typekey MaxLower, MinUpper;
struct rec LastRead;
extern struct rec Buff[];
while ( b>a ) {
rupp = wupp = b;
rlow = wlow = a;
InBuff = 0;
MaxLower = MinimumKey;
MinUpper = MaximumKey;
i = a-1;
j = b+1;
/*** Partition the file ***/
while ( rupp >= rlow ) {
if ( rlow-wlow < wupp-rupp )
LastRead = ReadDirect( rlow++ );
else LastRead = ReadDirect( rupp-- );
if ( InBuff < M ) {
Buff[ InBuff++ ] = LastRead;
intsort( Buff, 0, InBuff-1 );
}
else {
if ( LastRead.k > Buff[M-1].k ) {
if ( LastRead.k > MinUpper ) j = wupp;
else MinUpper = LastRead.k;
WriteDirect( wupp--, LastRead);
}
else if ( LastRead.k < Buff[0].k ) {
if ( LastRead.k < MaxLower ) i = wlow;
else MaxLower = LastRead.k;
WriteDirect( wlow++, LastRead);
}
else if ( wlow-a < b-wupp ) {
WriteDirect( wlow++, Buff[0] );
MaxLower = Buff[0].k;
Buff[0] = LastRead;
intsort( Buff, 0, M-1 );
}
else { WriteDirect( wupp--, Buff[M-1] ) ;
MinUpper = Buff[M-1].k;
Buff[M-1] = LastRead;
intsort( Buff, 0, M-1 );
}
}
}
while ( InBuff>0 ) WriteDirect( wupp--, Buff[--InBuff] );
/*** sort the shortest subfile first ***/
if (i-a < b-j) { sort(a,i); a = j; }
else { sort(j,b); b = i; }
}
return( 1 );
};
|