Télécharger ordm02.eso

Retour à la liste

Numérotation des lignes :

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

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