PROCEDURE ADDHEAP(HEAD,TAIL:INTEGER); VAR MIN,W:INTEGER; BEGIN IF 2*HEAD>TAIL THEN MIN:=-1 ELSE IF 2*HEAD=TAIL THEN MIN:=TAIL ELSE IF A[2*HEAD]>A[2*HEAD+1] THEN MIN:=2*HEAD+1 ELSE MIN:=2*HEAD; IF (MIN>0) AND (A[HEAD]>A[MIN]) THEN BEGIN W:=A[HEAD]; A[HEAD]:=A[MIN]; A[MIN]:=W; ADDHEAP(MIN,TAIL) END END; PROCEDURE MAKEHEAP(HEAD,TAIL:INTEGER); VAR X:INTEGER; BEGIN X:=(TAIL DIV 2)+1; WHILE X>HEAD DO BEGIN X:=X-1; ADDHEAP(X,TAIL) END END; PROCEDURE QSORT2 (FWARD,BWARD:RANGE); VAR MAE,USIRO:RANGE; NAKA,W:INTEGER; BEGIN MAE:=FWARD; USIRO:=BWARD; NAKA:=A[(MAE+USIRO) DIV 2]; IF USIRO-MAENAKA DO USIRO:=USIRO-1; IF MAE<=USIRO THEN BEGIN W:=A[MAE]; A[MAE]:=A[USIRO]; A[USIRO]:=W; MAE:=MAE+1; USIRO:=USIRO-1 END ; UNTIL MAE>USIRO; IF USIRO>FWARD THEN QSORT2 (FWARD,USIRO); IF MAE