!
! =====> Program - P96.F90
!
INTEGER LIST (1000)
COMMON /COUNTS/NCOMP,NSWAP
!
!
PRINT *, 'This is Program >> P96 - Shell sort'
!
! Tell program where data for READ * is coming from
OPEN(UNIT=5, FILE='P96.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 SHELL(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 SHELL(LIST,N)
INTEGER LIST(1)
COMMON /COUNTS/NCOMP,NSWAP
NCOMP=0
NSWAP=0
M=N
L1: DO WHILE (M > 1)
M=(M+2)/3
L2: DO I=M+1,N
L3: DO J=I,M+1,-M
NCOMP=NCOMP+1
IF(LIST(J-M) < LIST(J)) EXIT
CALL SWAP(LIST(J),LIST(J-M))
NSWAP=NSWAP+1
END DO L3
END DO L2
END DO L1
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 >> P96 - Shell sort
BEFORE SORTING
59 72 41 16 27 17 11
AFTER SORTING
11 16 17 27 41 59 72
NUMBER OF COMPARISONS= 16
NUMBER OF EXCHANGES= 10
Fortran-90 STOP
Page builder: Charles Boivin
Last modified: 11/07/95