Télécharger ordm03.eso

Retour à la liste

Numérotation des lignes :

ordm03
  1. C ORDM03 SOURCE JC220346 14/12/16 21:15:04 8324
  2. ************************************************************************
  3. * NOM : ORDM03
  4. * DESCRIPTION : Tri par fusion (Merge Sort) pour une liste de reels
  5. * On renvoie en plus le nouvel ORDRE des elements
  6. ************************************************************************
  7. * APPELE PAR : pilot.eso
  8. ************************************************************************
  9. * ENTREES :: A = liste de reels a trier
  10. * AI = rang des elements de A (entiers de 1 a N)
  11. * N = longueur des listes A et AI
  12. * T = tableau de travail de reels de longueur (N+1)/2
  13. * TI = tableau de travail d'entiers de longueur (N+1)/2
  14. * CROISS = booleen indiquant l'ordre du tri
  15. * SORTIES :: A = liste triee
  16. * AI = position initiale des elements de la liste triee
  17. ************************************************************************
  18. RECURSIVE SUBROUTINE ORDM03(A,AI,N,T,TI,CROISS)
  19. *
  20. INTEGER I,J,K,N,NA,NB,AI,TI,VI
  21. REAL*8 A,T,V
  22. DIMENSION A(N),AI(N),T((N+1)/2),TI((N+1)/2)
  23. LOGICAL CROISS,DECROI
  24. *
  25. * On arrete la recursion pour N=1 ou N=2
  26. IF (N.LT.2) RETURN
  27. DECROI = .NOT.CROISS
  28. IF (N.EQ.2) THEN
  29. IF ((CROISS.AND.A(1).GT.A(2)).OR.
  30. & (DECROI.AND.A(1).LT.A(2))) THEN
  31. V = A(1)
  32. A(1) = A(2)
  33. A(2) = V
  34. VI = AI(1)
  35. AI(1) = AI(2)
  36. AI(2) = VI
  37. ENDIF
  38. RETURN
  39. ENDIF
  40. *
  41. * Sinon, on subdivise en deux sous-listes plus petites que l'on
  42. * va ordonner separement
  43. NA=(N+1)/2
  44. NB=N-NA
  45. CALL ORDM03(A,AI,NA,T,TI,CROISS)
  46. CALL ORDM03(A(NA+1),AI(NA+1),NB,T,TI,CROISS)
  47. *
  48. * On melange les deux petites sous-listes en une grande liste
  49. * ordonnee (avec un peu de chance, il n'y a rien a faire...)
  50. IF ((CROISS.AND.A(NA).GT.A(NA+1)).OR.
  51. & (DECROI.AND.A(NA).LT.A(NA+1))) THEN
  52. T(1:NA)=A(1:NA)
  53. TI(1:NA)=AI(1:NA)
  54. I = 1
  55. J = 1
  56. K = 1
  57. DO WHILE (I.LE.NA.AND.J.LE.NB)
  58. V = A(NA+J)
  59. VI = AI(NA+J)
  60. IF ((CROISS.AND.T(I).LE.V).OR.
  61. & (DECROI.AND.T(I).GE.V)) THEN
  62. A(K) = T(I)
  63. AI(K) = TI(I)
  64. I = I+1
  65. ELSE
  66. A(K) = V
  67. AI(K) = VI
  68. J = J+1
  69. ENDIF
  70. K = K + 1
  71. ENDDO
  72. *
  73. DO WHILE (I.LE.NA)
  74. A(K) = T(I)
  75. AI(K) = TI(I)
  76. I = I + 1
  77. K = K + 1
  78. ENDDO
  79. ENDIF
  80. *
  81. RETURN
  82. *
  83. END
  84. *
  85.  

© Cast3M 2003 - Tous droits réservés.
Mentions légales