sort()
{
int i, j, some;
extern int maxfiles, maxruns[], actruns[];
extern struct rec LastRec[];
/*** Initialize input/output files ***/
OpenRead( 1 );
for (i=2; i<=maxfiles; i++) openwrite( i ); /*** initialize maximum and actual count of runs ***/ for (i=0; i<=maxfiles; i++) maxruns[i]=actruns[i] =0; maxruns[0]=maxruns[maxfiles] =1; distribute(); /*** initialize merging phase ***/ for (i=2; i<=maxfiles; i++) { openread( i ); lastrec[i]=ReadFile(i); } for (i=1; maxruns[0]>1; i = (i%maxfiles)+1 ) {
OpenWrite( i );
while ( maxruns[ (i%maxfiles)+1 ] > 0 ) {
for (j=1; j<=maxfiles; j++) if ( j!=i ) { if ( maxruns[j]>actruns[j] )
FilStat[j] = '-';
else { FilStat[j] = 'i';
actruns[j]--;
some = TRUE;
}
maxruns[j]--; maxruns[0]--;
}
maxruns[i]++; maxruns[0]++;
if (some) { merge(i); actruns[i]++; }
}
OpenRead( i ); LastRec[i] = ReadFile(i);
};
return( i==1 ? maxfiles : i-1 );
};
|