************************************************************************
* File: bubsort.for
************************************************************************
* Scopo: Modulo per l'ordinamento di un vettore, secondo l'algoritmo di
*        ordinamento a bolle (bubble sort)
*        (cfr. libro Calvanese et al. paragrafo 3.4.2)
************************************************************************

      SUBROUTINE BubSort (vett, n)
* Ordina il vettore vett di n elementi utilizzando l'ordinamento a bolle
      IMPLICIT NONE

* Dichiarazioni tipo parametri formali
*   parametri di input
      INTEGER n
*   parametri di input-output
      INTEGER vett(n)

* Dichiarazioni di variabili locali
      INTEGER i, j, temp
      LOGICAL scambio

* Inizializzazioni di variabili
      DATA i/1/

*     REPEAT
 10     scambio = .FALSE.
* analogo di un ciclo FOR ... DOWNTO del PASCAL
        DO 20 j = n, i+1, -1
          IF (vett(j) .LT. vett(j-1)) THEN
            temp = vett(j)
            vett(j) = vett(j-1)
            vett(j-1) = temp
            scambio = .TRUE.
          ENDIF
 20     CONTINUE
*       fine ciclo DO
        i = i+1
      IF (scambio) GOTO 10
*     UNTIL (.NOT. scambio)

      RETURN
      END