PROCEDURE repsort(VAR infile, outfile :TEXT; len :INTEGER); VAR buff :heap_buff; data,i,last_data,tail :INTEGER; PROCEDURE swap(VAR x,y :INTEGER); VAR z :INTEGER; BEGIN z := x; x := y; y := z END; PROCEDURE makeheap(VAR buff :heap_buff; head,tail :INTEGER); BEGIN IF tail < 2*head THEN {buff[head] is a leaf} ELSE IF tail = 2*head THEN {buff[head] has just a left son} BEGIN makeheap(buff,2*head,tail); IF buff[2*head] < buff[head] THEN BEGIN swap(buff[2*head],buff[head]); makeheap(buff,2*head,tail) END END ELSE {buff[head] has left son and right son} BEGIN makeheap(buff,2*head,tail); makeheap(buff,2*head + 1,tail); IF (buff[2*head] < buff[head]) OR (buff[2*head + 1] < buff[head]) THEN IF buff[2*head] < buff[2*head + 1] THEN BEGIN swap(buff[2*head],buff[head]); makeheap(buff,2*head,tail) END ELSE BEGIN swap(buff[2*head + 1],buff[head]); makeheap(buff,2*head + 1,tail) END END END; PROCEDURE first_read; const n=999; BEGIN for i:=0 to n do i := 0; REPEAT i:= i+1; readln(infile); buff[i] := data; UNTIL EOF(infile) OR (i = len); END; PROCEDURE last_out(tail :INTEGER); BEGIN REPEAT makeheap(buff,1,tail); WRITE(lst,outfile, buff[1]:10); buff[1] := buff[tail]; tail := tail - 1 UNTIL tail = 0; WRITELN(lst,outfile) END; BEGIN tail := len; first_read; IF i < tail THEN last_out(i) ELSE BEGIN REPEAT makeheap(buff,1,tail); last_data := buff[1]; WRITE(lst,outfile, last_data:10); readln(infile,len); IF last_data <= data THEN buff[1] := data ELSE BEGIN buff[1] := buff[tail]; buff[tail] := data; tail := tail - 1; IF tail = 0 THEN BEGIN last_data := -MAXINT - 1; WRITELN(lst,outfile); tail := len END END UNTIL EOF(infile); makeheap(buff,1,len); IF buff[1] < last_data THEN WRITELN(lst,outfile); last_out(len) END END;