[Back to SORTING SWAG index]  [Back to Main SWAG index]  [Original]


{$A+,B-,D-,E-,F-,G+,I-,K-,L-,N-,O-,P-,Q-,R-,S-,T-,V-,W-,X-,Y-}

{Sorts a data file on disk}

{*WARNING*: This program will create two .5Mb files for test
 purposes. Reduce the constant "Max" to about 100 if you only
 want a quick look at the program.}

PROGRAM DiskSort;
USES  Dos;                          {For start/stop time}
CONST Max=1000;                     {Number of records}
TYPE  OneRecord=RECORD              {550 bytes}
                 S:String[20];      {The sorted field}
                 W:Word;            {Some other fields..}
                 B:Byte;
                 I:Integer;
                 R:Real;
                 P:Pointer;
                 L:LongInt;
                 X:String;
                 Y:String;
                END;
 
      FileType=File OF OneRecord;
{------------------------------------------------}
{This routine creates the data file and writes
 randomly generated records in it for testing.}
 
PROCEDURE CreateDataFile(FileName:String);
VAR This:OneRecord; F:FileType; N,X,C:Integer;
BEGIN
 Assign(F,FileName); Rewrite(F);
 FOR N:=1 TO Max DO
  BEGIN
   FillChar(This,SizeOf(This),#0);
   FOR X:=1 TO 20 DO
    BEGIN
     REPEAT
      C:=Random(100);
     UNTIL C IN [65..90];
     This.S:=This.S+Chr(C);
    END;
   Write(F,This);
  END; Close(F);
END;
{------------------------------------------------}
{This routine sorts the data file and puts the sorted
 records in the temp file.}

PROCEDURE SortDataFile(FileName,TempName:String);
VAR Old,This,Saved,Temp:OneRecord; F1,F2:FileType;
    N1,N2,N3:LongInt; SavedStr:String[20];
 {-----------------------------------------------}
 PROCEDURE CheckIt;  {comparison routine}
  BEGIN
   IF This.S<SavedStr THEN
    BEGIN
     SavedStr:=This.S;
     Temp:=This; This:=Saved; Saved:=Temp;
     N3:=Pred(FilePos(F1));
    END;
  END;
 {-----------------------------------------------}
BEGIN
 Assign(F1,FileName); Reset(F1);
 Assign(F2,TempName); Rewrite(F2);
 N1:=0; N2:=FileSize(F1); N3:=0;
 REPEAT
  Seek(F1,N1); Read(F1,Old);
  SavedStr:=Old.S; This:=Old; Saved:=Old;
  WHILE NOT EOF(F1) DO
   BEGIN CheckIt; Read(F1,This); END;
  CheckIt;
  Seek(F1,N3); Write(F1,Old);
  Seek(F2,FileSize(F2)); Write(F2,Saved);
  Inc(N1);
 UNTIL N1>=N2;
 Close(F1); Close(F2);
END;
{------------------------------------------------}
VAR S1,S2:String; H,M,S,U:Word;
BEGIN
 Randomize;
 S1:='MIXED.DAT'; S2:='SORTED.DAT';
 Writeln;
 Writeln('Creating the data file ',S1);
 CreateDataFile(S1);
 Writeln;
 Writeln('Now sorting it as ',S2);
 GetTime(H,M,S,U);
 Writeln('Start : ',H,':',M,':',S,'.',U);
 SortDataFile(S1,S2);
 GetTime(H,M,S,U);
 Writeln('Stop  : ',H,':',M,':',S,'.',U);
END.

[Back to SORTING SWAG index]  [Back to Main SWAG index]  [Original]