P94.F90

Cocktail shaker sort


!
! =====> Program - P94.F90
!
      INTEGER LIST (1000)
      COMMON /COUNTS/NCOMP,NSWAP
!
!
      PRINT *, 'This is Program >> P94  - Cocktail shaker sort'
!
!     Tell program where data for  READ *  is coming from
      OPEN(UNIT=5, FILE='P94.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 SHAKE(LIST,N)
!
      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
!
      SUBROUTINE SHAKE(LIST,N)
      INTEGER LIST(1),RIGHT
      COMMON /COUNTS/NCOMP,NSWAP
      NCOMP=0
      NSWAP=0
      LEFT=1
      RIGHT=N
L1:   DO I=1,N
         CALL BSORTR(LIST,LEFT,RIGHT,K)
         IF(K == 0) RETURN
         CALL BSORTL(LIST,LEFT,RIGHT,K)
         IF(K == 0) RETURN
      END DO L1
      RETURN
      END
!
      SUBROUTINE BSORTR(LIST,L,M,K)
!
!     RIGHT BUBBLE SORT
!
      INTEGER LIST(1)
      COMMON /COUNTS/NCOMP,NSWAP
      M=M-1
      K=0
L1:   DO I=L,M
         NCOMP=NCOMP+1
         IF(LIST(I) > LIST(I+1)) THEN
            CALL SWAP(LIST(I),LIST(I+1))
            NSWAP=NSWAP+1
            K=I
         ENDIF
      END DO L1
      M=K
      RETURN
      END
!
      SUBROUTINE BSORTL(LIST,L,M,K)
!
!     LEFT BUBBLE SORT
!
      INTEGER LIST(1)
      COMMON /COUNTS/NCOMP,NSWAP
      L=L+1
      K=0
L1:   DO I=M,L,-1
         NCOMP=NCOMP+1
         IF(LIST(I) < LIST(I-1)) THEN
            CALL SWAP(LIST(I),LIST(I-1))
            NSWAP=NSWAP+1
            K=I
         ENDIF
      END DO L1
      L=K
      RETURN
      END
!
      SUBROUTINE SWAP(K,L)
      M=K
      K=L
      L=M
      RETURN
      END

DATA:
7
59  72  41  16  27  17  11

OUTPUT:
Program entered
 This is Program >> P94  - Cocktail shaker sort

BEFORE SORTING

   59   72   41   16   27   17   11
  

AFTER SORTING

   11   16   17   27   41   59   72

NUMBER OF COMPARISONS= 21
NUMBER OF EXCHANGES= 18


Fortran-90 STOP

Come back to the previous page

Page builder: Charles Boivin

Last modified: 11/07/95