C ORDM13 SOURCE JC220346 14/12/16 21:15:06 8324 ************************************************************************ * NOM : ORDM13 * DESCRIPTION : Tri par fusion (Merge Sort) pour une liste de reels * On tient seulement compte de leur valeur ABSOLUE * On renvoie en plus le nouvel ORDRE des elements ************************************************************************ * APPELE PAR : pilot.eso ************************************************************************ * ENTREES :: A = liste de reels a trier * AI = rang des elements de A (entiers de 1 a N) * N = longueur des listes A et AI * T = tableau de travail de reels de longueur (N+1)/2 * TI = tableau de travail d'entiers de longueur (N+1)/2 * CROISS = booleen indiquant l'ordre du tri * SORTIES :: A = liste triee * AI = position initiale des elements de la liste triee ************************************************************************ RECURSIVE SUBROUTINE ORDM13(A,AI,N,T,TI,CROISS) * INTEGER I,J,K,N,NA,NB,AI,TI,VI REAL*8 A,T,V DIMENSION A(N),AI(N),T((N+1)/2),TI((N+1)/2) LOGICAL CROISS,DECROI * * On arrete la recursion pour N=1 ou N=2 IF (N.LT.2) RETURN DECROI = .NOT.CROISS IF (N.EQ.2) THEN IF ((CROISS.AND.ABS(A(1)).GT.ABS(A(2))).OR. & (DECROI.AND.ABS(A(1)).LT.ABS(A(2)))) THEN V = A(1) A(1) = A(2) A(2) = V VI = AI(1) AI(1) = AI(2) AI(2) = VI ENDIF RETURN ENDIF * * Sinon, on subdivise en deux sous-listes plus petites que l'on * va ordonner separement NA=(N+1)/2 NB=N-NA CALL ORDM13(A,AI,NA,T,TI,CROISS) CALL ORDM13(A(NA+1),AI(NA+1),NB,T,TI,CROISS) * * On melange les deux petites sous-listes en une grande liste * ordonnee (avec un peu de chance, il n'y a rien a faire...) IF ((CROISS.AND.ABS(A(NA)).GT.ABS(A(NA+1))).OR. & (DECROI.AND.ABS(A(NA)).LT.ABS(A(NA+1)))) THEN T(1:NA)=A(1:NA) TI(1:NA)=AI(1:NA) I = 1 J = 1 K = 1 DO WHILE (I.LE.NA.AND.J.LE.NB) V = A(NA+J) VI = AI(NA+J) IF ((CROISS.AND.ABS(T(I)).LE.ABS(V)).OR. & (DECROI.AND.ABS(T(I)).GE.ABS(V))) THEN A(K) = T(I) AI(K) = TI(I) I = I+1 ELSE A(K) = V AI(K) = VI J = J+1 ENDIF K = K + 1 ENDDO * DO WHILE (I.LE.NA) A(K) = T(I) AI(K) = TI(I) I = I + 1 K = K + 1 ENDDO ENDIF * RETURN * END *