38 lines
1.1 KiB
Plaintext
38 lines
1.1 KiB
Plaintext
DCL (T(10)) FIXED BIN(31); /* scratch space of length N/2 */
|
|
|
|
MERGE: PROCEDURE (A,LA,B,LB,C);
|
|
DECLARE (A(*),B(*),C(*)) FIXED BIN(31);
|
|
DECLARE (LA,LB) FIXED BIN(31) NONASGN;
|
|
DECLARE (I,J,K) FIXED BIN(31);
|
|
|
|
I=1; J=1; K=1;
|
|
DO WHILE ((I <= LA) & (J <= LB));
|
|
IF(A(I) <= B(J)) THEN
|
|
DO; C(K)=A(I); K=K+1; I=I+1; END;
|
|
ELSE
|
|
DO; C(K)=B(J); K=K+1; J=J+1; END;
|
|
END;
|
|
DO WHILE (I <= LA);
|
|
C(K)=A(I); I=I+1; K=K+1;
|
|
END;
|
|
RETURN;
|
|
END MERGE;
|
|
|
|
MERGESORT: PROCEDURE (A,N) RECURSIVE ;
|
|
DECLARE (A(*)) FIXED BINARY(31);
|
|
DECLARE N FIXED BINARY(31) NONASGN;
|
|
DECLARE Temp FIXED BINARY;
|
|
DECLARE (M,I) FIXED BINARY;
|
|
DECLARE AMP1(N) FIXED BINARY(31) BASED(P);
|
|
DECLARE P POINTER;
|
|
IF (N=1) THEN RETURN;
|
|
M = trunc((N+1)/2);
|
|
IF (M>1) THEN CALL MERGESORT(A,M);
|
|
P=ADDR(A(M+1));
|
|
IF (N-M > 1) THEN CALL MERGESORT(AMP1,N-M);
|
|
IF A(M) <= AMP1(1) THEN RETURN;
|
|
DO I=1 to M; T(I)=A(I); END;
|
|
CALL MERGE(T,M,AMP1,N-M,A);
|
|
RETURN;
|
|
END MERGESORT;
|