!
! =====> 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
Page builder: Charles Boivin
Last modified: 11/07/95