!
      PROGRAM P91
!
      IMPLICIT NONE
      INTEGER :: LIST(1000),COUNTS,NCOMP,NSWAP
      INTEGER :: N,I
!
      INTERFACE
      SUBROUTINE SORT1(LIST,N,COUNTS,NCOMP,NSWAP)
      IMPLICIT NONE
      INTEGER ,INTENT(IN OUT) :: LIST(:),N,COUNTS,NCOMP,NSWAP
       SUBROUTINE SWAP(LIST,K,L)
       IMPLICIT NONE
       INTEGER ,INTENT(IN OUT) :: LIST(:),K,L
       END SUBROUTINE SWAP
      END SUBROUTINE SORT1
      END INTERFACE
!
!
      PRINT *, 'This is Program >> P91  - Interchange sort'
!
!     Tell program where data for  READ *  is coming from
      OPEN(UNIT=5, FILE='P91.DAT') 
! UNIT=5 is the default input
!
      READ * ,N
      READ * ,(LIST(I),I=1,N)
      PRINT 17
  17  FORMAT(' BEFORE SORTING'/)
     PRINT 16,(LIST(I),I=1,N)
      PRINT *,' '
!
!     SORT WITH SUBROUTINES
!
      CALL SORT1(LIST,N,COUNTS,NCOMP,NSWAP)
!
      PRINT 14
  14  FORMAT(' AFTER SORTING'/)
      PRINT 16,(LIST(I),I=1,N)
  16  FORMAT(20I5)
      PRINT 27,NCOMP,NSWAP
  27  FORMAT(' NUMBER OF COMPARISONS=',I3/  & ' NUMBER OF EXCHANGES=',I3//)
      STOP
      END PROGRAM P91
!
      SUBROUTINE SORT1(LIST,N,COUNTS,NCOMP,NSWAP)
      IMPLICIT NONE
      INTEGER ,INTENT(IN OUT) :: LIST(:),N,COUNTS,NCOMP,NSWAP
      INTEGER :: I,J,K     
      PRINT 18
  18  FORMAT(' SORTING'/)
      NCOMP=0
      NSWAP=0
L1:   DO I=1,N-1
L2:      DO J=I+1,N
            NCOMP=NCOMP+1
            IF(LIST(I).GT.LIST(J)) THEN
                CALL SWAP(LIST,I,J)
               NSWAP=NSWAP+1
            ENDIF
         END DO L2
         PRINT 16,(LIST(K),K=1,N)
  16     FORMAT(20I5)
      END DO L1
      RETURN
      END SUBROUTINE SORT1
!
      SUBROUTINE SWAP(LIST,K,L)
      IMPLICIT NONE
      INTEGER ,INTENT(IN OUT) :: LIST(:),K,L
      INTEGER :: M
      M=LIST(K)
      LIST(K)=LIST(L)
      LIST(L)=M
      RETURN
      END SUBROUTINE SWAP