Télécharger ordm11.eso

Retour à la liste

Numérotation des lignes :

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

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