! ! =====> 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