      PROGRAM P95
      IMPLICIT NONE
      INTEGER :: LIST(1000),NCOMP,NSWAP,N,I
      INTERFACE
        SUBROUTINE SELECT(LIST,N,NCOMP,NSWAP)
          IMPLICIT NONE
          INTEGER,INTENT(IN) :: N
          INTEGER,INTENT(IN OUT) :: LIST(:)
          INTEGER,INTENT(OUT) :: NCOMP,NSWAP
        END SUBROUTINE SELECT
      END INTERFACE
!
!
      PRINT *, 'This is Program >> P95  - Selection sort'
!
!     Tell program where data for  READ *  is coming from
      OPEN(UNIT=5, FILE='P95.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 SELECT(LIST,N,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 P95
!
      SUBROUTINE SELECT(LIST,N,NCOMP,NSWAP)
!
      IMPLICIT NONE
      INTEGER,INTENT(IN) :: N
      INTEGER,INTENT(IN OUT) :: LIST(:)
      INTEGER,INTENT(OUT):: NCOMP,NSWAP
      INTEGER :: SMALL,I,J,K,TEMP
      PRINT 18,
  18  FORMAT(' SORTING'/)
      NCOMP=0
      NSWAP=0
L1:   DO I=1,N-1
         SMALL=LIST(I)
         K=I
L2:      DO J=I+1,N
            NCOMP=NCOMP+1
            IF(LIST(J)<SMALL) THEN
               K=J
               SMALL=LIST(J)
            END IF
         END DO L2
         TEMP=LIST(I)
         LIST(I)=LIST(K)
         LIST(K)=TEMP
         NSWAP=NSWAP+1
         PRINT 16, (LIST(K),K=1,N)
  16     FORMAT(20I5)
      END DO L1
      RETURN
      END SUBROUTINE SELECT
!