Télécharger ordm14.eso

Retour à la liste

Numérotation des lignes :

  1. C ORDM14 SOURCE JC220346 14/12/16 21:15:07 8324
  2. ************************************************************************
  3. * NOM : ORDM14
  4. * DESCRIPTION : Tri par fusion (Merge Sort) pour une liste d'entiers
  5. * On tient seulement compte de leur valeur ABSOLUE
  6. * On renvoie en plus le nouvel ORDRE des elements
  7. ************************************************************************
  8. * APPELE PAR : pilot.eso
  9. ************************************************************************
  10. * ENTREES :: A = liste d'entiers a trier
  11. * AI = rang des elements de A (entiers de 1 a N)
  12. * N = longueur des listes A et AI
  13. * T = tableau de travail d'entiers de longueur (N+1)/2
  14. * TI = tableau de travail d'entiers de longueur (N+1)/2
  15. * CROISS = booleen indiquant l'ordre du tri
  16. * SORTIES :: A = liste triee
  17. * AI = position initiale des elements de la liste triee
  18. ************************************************************************
  19. RECURSIVE SUBROUTINE ORDM14(A,AI,N,T,TI,CROISS)
  20. *
  21. INTEGER I,J,K,N,NA,NB,A,T,V,AI,TI,VI
  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.ABS(A(1)).GT.ABS(A(2))).OR.
  30. & (DECROI.AND.ABS(A(1)).LT.ABS(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 ORDM14(A,AI,NA,T,TI,CROISS)
  46. CALL ORDM14(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.ABS(A(NA)).GT.ABS(A(NA+1))).OR.
  51. & (DECROI.AND.ABS(A(NA)).LT.ABS(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.ABS(T(I)).LE.ABS(V)).OR.
  61. & (DECROI.AND.ABS(T(I)).GE.ABS(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