PROCEDURE BINARY(A:DIM; N:INTEGER; B:DIM; M:INTEGER; VAR C:DIM); VAR O:INTEGER; P:INTEGER; PROCEDURE MOVE(F:DIM; Q:INTEGER; R:INTEGER); (* BINARY-MOVE *) VAR O:INTEGER; W:INTEGER; BEGIN (* MOVE *) W := P; FOR O:=R DOWNTO Q DO BEGIN C[W]:=F[O]; W := W - 1 END END; (* MOVE *) PROCEDURE BSEARCH( (* BINARY-BSEARCH *) X:INTEGER; F:DIM; L:INTEGER; R:INTEGER; VAR J:INTEGER ); VAR RESULT:INTEGER; BEGIN (* BSEARCH *) IF R0 DO BEGIN K:=K*2; S:=S-1 END; IF G[W]<=F[ V-K+1 ] THEN BEGIN MOVE(F,V-K+1,V); V:=V-K; P:=P-K; END ELSE BEGIN BSEARCH (G[W],F,V-K+2,V,J) ; MOVE(F,J+1,V); P:=P-V+J; C[P] := G[W]; V := J; W:=W-1; P:=P-1 END END; (* BMRGE *) BEGIN (* BINARY *) P:=N+M; WHILE (N>0) AND (M>0) DO IF N>M THEN BMRGE(A,N,B,M) ELSE BMRGE(B,M,A,N); IF N=0 THEN MOVE(B,1,M) ELSE MOVE(A,1,N) END; (* BINARY *)