       IDENTIFICATION DIVISION.
       PROGRAM-ID. READ3WGT1LINESORT.

       ENVIRONMENT DIVISION.
       INPUT-OUTPUT SECTION.
       FILE-CONTROL.
           COPY "OPTIONAL.CPY".
       DATA DIVISION.
       FILE SECTION.

       FD  FIETS-FILE.
       01  FIETS-REC.
           05 F-DATE       PIC X(8).
           05 F-DIST       PIC 9(5).
           05 F-TIMESEC    PIC 9(5).
           05 F-HR         PIC 9(3).
           05 F-WGT        PIC 9(3).

       FD  LOOP-FILE.
       01  LOOP-REC.
           05 L-DATE       PIC X(8).
           05 L-DIST       PIC 9(5).
           05 L-TIMESEC    PIC 9(5).
           05 L-HR         PIC 9(3).
           05 L-WGT        PIC 9(3).

       FD  ZWEM-FILE.
       01  ZWEM-REC.
           05 Z-DATE       PIC X(8).
           05 Z-DIST       PIC 9(5).
           05 Z-TIMESEC    PIC 9(5).
           05 Z-HR         PIC 9(3).
           05 Z-WGT        PIC 9(3).

       WORKING-STORAGE SECTION.

       01  EOF-FIETS       PIC X VALUE "N".
       01  EOF-LOOP        PIC X VALUE "N".
       01  EOF-ZWEM        PIC X VALUE "N".

       01  WS-MIN          PIC 9(3).
       01  WS-SEC          PIC 9(2).

       01  REC-IDX         PIC 9(4) VALUE 0.
       01  I               PIC 9(4).
       01  J               PIC 9(4).
       01  GAP             PIC 9(4).
       01  START-I         PIC 9(4).

       01  TEMP-REC.
           05 T-SPT        PIC X(5).
           05 T-DATE       PIC X(8).
           05 T-DIST       PIC 9(5).
           05 T-TIMESEC    PIC 9(5).
           05 T-HR         PIC 9(3).
           05 T-WGT        PIC 9(3).

       01  ALL-RECS.
           05 A-REC OCCURS 500 TIMES.
              10 A-SPT     PIC X(5).
              10 A-DATE    PIC X(8).
              10 A-DIST    PIC 9(5).
              10 A-TIMESEC PIC 9(5).
              10 A-HR      PIC 9(3).
              10 A-WGT     PIC 9(3).

       PROCEDURE DIVISION.
       MAIN-LOGIC.

           OPEN INPUT FIETS-FILE
           OPEN INPUT LOOP-FILE
           OPEN INPUT ZWEM-FILE

           PERFORM READ-FIETS
           PERFORM UNTIL EOF-FIETS = "Y"
              ADD 1 TO REC-IDX
              MOVE "FIETS"   TO A-SPT(REC-IDX)
              MOVE F-DATE    TO A-DATE(REC-IDX)
              MOVE F-DIST    TO A-DIST(REC-IDX)
              MOVE F-TIMESEC TO A-TIMESEC(REC-IDX)
              MOVE F-HR      TO A-HR(REC-IDX)
              MOVE F-WGT     TO A-WGT(REC-IDX)
              PERFORM READ-FIETS
           END-PERFORM

           PERFORM READ-LOOP
           PERFORM UNTIL EOF-LOOP = "Y"
              ADD 1 TO REC-IDX
              MOVE "LOOP"    TO A-SPT(REC-IDX)
              MOVE L-DATE    TO A-DATE(REC-IDX)
              MOVE L-DIST    TO A-DIST(REC-IDX)
              MOVE L-TIMESEC TO A-TIMESEC(REC-IDX)
              MOVE L-HR      TO A-HR(REC-IDX)
              MOVE L-WGT     TO A-WGT(REC-IDX)
              PERFORM READ-LOOP
           END-PERFORM

           PERFORM READ-ZWEM
           PERFORM UNTIL EOF-ZWEM = "Y"
              ADD 1 TO REC-IDX
              MOVE "ZWEM"    TO A-SPT(REC-IDX)
              MOVE Z-DATE    TO A-DATE(REC-IDX)
              MOVE Z-DIST    TO A-DIST(REC-IDX)
              MOVE Z-TIMESEC TO A-TIMESEC(REC-IDX)
              MOVE Z-HR      TO A-HR(REC-IDX)
              MOVE Z-WGT     TO A-WGT(REC-IDX)
              PERFORM READ-ZWEM
           END-PERFORM

           CLOSE FIETS-FILE
           CLOSE LOOP-FILE
           CLOSE ZWEM-FILE

           COMPUTE GAP = REC-IDX / 2

           PERFORM UNTIL GAP < 1

              MOVE GAP TO START-I
              ADD 1 TO START-I

              PERFORM VARYING I FROM START-I BY 1
                      UNTIL I > REC-IDX

                 MOVE A-SPT(I)     TO T-SPT
                 MOVE A-DATE(I)    TO T-DATE
                 MOVE A-DIST(I)    TO T-DIST
                 MOVE A-TIMESEC(I) TO T-TIMESEC
                 MOVE A-HR(I)      TO T-HR
                 MOVE A-WGT(I)     TO T-WGT

                 COMPUTE J = I - GAP

                 PERFORM UNTIL J < 1
                    IF A-DATE(J) > T-DATE
                       MOVE A-SPT(J)     TO A-SPT(J + GAP)
                       MOVE A-DATE(J)    TO A-DATE(J + GAP)
                       MOVE A-DIST(J)    TO A-DIST(J + GAP)
                       MOVE A-TIMESEC(J) TO A-TIMESEC(J + GAP)
                       MOVE A-HR(J)      TO A-HR(J + GAP)
                       MOVE A-WGT(J)     TO A-WGT(J + GAP)
                       SUBTRACT GAP FROM J
                    ELSE
                       EXIT PERFORM
                    END-IF
                 END-PERFORM

                 MOVE T-SPT     TO A-SPT(J + GAP)
                 MOVE T-DATE    TO A-DATE(J + GAP)
                 MOVE T-DIST    TO A-DIST(J + GAP)
                 MOVE T-TIMESEC TO A-TIMESEC(J + GAP)
                 MOVE T-HR      TO A-HR(J + GAP)
                 MOVE T-WGT     TO A-WGT(J + GAP)

              END-PERFORM

              COMPUTE GAP = GAP / 2

           END-PERFORM

           PERFORM VARYING I FROM 1 BY 1 UNTIL I > REC-IDX
              COMPUTE WS-MIN = A-TIMESEC(I) / 60
              COMPUTE WS-SEC = A-TIMESEC(I) - (WS-MIN * 60)

              DISPLAY A-SPT(I) ": "
                      A-DATE(I) " "
                      A-DIST(I) " "
                      WS-MIN ":" WS-SEC " "
                      A-HR(I) " "
                      A-WGT(I)
           END-PERFORM

           STOP RUN.

       READ-FIETS.
           READ FIETS-FILE
              AT END MOVE "Y" TO EOF-FIETS.
           EXIT.

       READ-LOOP.
           READ LOOP-FILE
              AT END MOVE "Y" TO EOF-LOOP.
           EXIT.

       READ-ZWEM.
           READ ZWEM-FILE
              AT END MOVE "Y" TO EOF-ZWEM.
           EXIT.

