PROCEDURE PMGSORT (VAR T:WKFILE ; MAXBLK,F1,F2:INTEGER) ; TYPE WKFILE = ARRAY[0..2] OF TEXT; BLK = ARRAY[1..500] OF INTEGER; VAR R,R2:INTEGER; BF:ARRAY [1..5] OF INTEGER; I,J :INTEGER; REW,RES,KEEP:INTEGER; FI:ARRAY [0..2] OF INTEGER; X:BLK; PROCEDURE BSORT(VAR X:BLK); var i,j,k :integer; begin for i := 2 to maxblk do for j := maxblk downto i do if x[j - 1] > x[j] then begin k := x[j - 1]; x[j - 1] := x[j]; x[j] := k end end; procedure mgsort(var tape1,tape2,tape3 :text); var a,b :integer; begin read(tape1,a); read(tape2,b); while not(eoln(tape1) or eoln(tape2)) do if a < b then begin write(lst,tape3,a:8); read(tape1,a) end else begin write(lst,tape3,b:8); read(tape2,b) end; if eoln(tape1) then while not eoln(tape2) do begin write(lst,tape3,b:8); read(tape2,b) end else while not eoln(tape1) do begin write(lst,tape3,a:8); read(tape1,a) end; readln(tape1); readln(tape2); writeln(lst,tape3,0:8) end; PROCEDURE YOMU (VAR F:TEXT; VAR X:BLK; MAXB :INTEGER); VAR J :INTEGER; BEGIN FOR J := 1 TO MAXB DO BEGIN READ(F,X[J]); IF EOLN(F) THEN READLN(F) END END; BEGIN REWRITE(T[1]); REWRITE(T[2]); ASSIGN(T[0],'B:TAPE0.CPM'); RESET(T[0]); FOR I := 1 TO F1 DO BEGIN YOMU(T[0],X,MAXBLK); BSORT(X); FOR J := 1 TO MAXBLK DO WRITE(T[1],X[J]:8); WRITELN(LST,T[1],0:8) END; FOR I := 1 TO F2 DO BEGIN YOMU(T[0],X,MAXBLK); BSORT(X); FOR J := 1 TO MAXBLK DO WRITE(T[2],X[J]:8); WRITELN(LST,T[2],0:8) END; REW := 0; RES := 1; KEEP := 2; FI[RES] := F1; FI[KEEP] := F2; RESET(T[2]); REPEAT CLOSE(T[REW]); CLOSE(T[RES]); REWRITE(T[REW]); RESET(T[RES]); REPEAT MGSORT(T[RES],T[KEEP],T[REW]) UNTIL EOF(T[KEEP]); FI[RES]:=FI[RES]-FI[KEEP]; FI[REW]:=FI[KEEP]; REW:=(REW+2)MOD 3; RES:=(RES+2)MOD 3; KEEP:=(KEEP+2)MOD 3; UNTIL FI[RES]=0; FOR R := 0 TO 2 DO CLOSE(T[R]) END;