program mergesort; uses streams1; var vstup, vystup : text; A : stream; procedure distribute(var inp,out1,out2 :stream); { rozdeluje behy streamu inp stridave do streamu out1 a out2} begin repeat copyrun(inp,out1); if not inp.Sempty then copyrun(inp,out2); until inp.Sempty; end; procedure merge(var inp1,inp2,outp: stream; var numr:longint ); {sleva streamy inp1 a inp2 do streamu outp, do parametru numr vraci pocet behu v streamu outp } begin numr:=0; repeat mergerun(inp1,inp2,outp); inc(numr); until inp1.Sempty or inp2.Sempty; { alespon jeden ze streamu inp1 a inp2 je prazdny } while not inp1.Sempty do begin copyrun(inp1,outp); inc(numr); end; while not inp2.Sempty do begin copyrun(inp2,outp); inc(numr); end; end; procedure natmerge(var A:stream); { tridi stream A metodou prirozeneho zatridovani } var pom1,pom2 : stream; numr : longint; begin assign(pom1.F,'pom1.aux'); assign(pom2.F,'pom2.aux'); repeat rewrite(pom1.F); rewrite(pom2.F); sreset(A); distribute(A,pom1,pom2); {rozdel} sreset(pom1); sreset(pom2); rewrite(A.F); merge(pom1,pom2,A,numr); {slej} until numr=1; close(pom1.F); close(pom2.F); end; begin assign(A.F,'dat.dat'); if eof(A.F) then writeln('chyba - vstupni soubor prazdny') else begin {jen pro ladeni } assign(vstup,'vstup.txt'); assign(vystup,'vystup.txt'); tisk(A,vstup); natmerge(A); {jen pro ladeni } tisk(A,vystup); end end.