! Program for sorting 500 or less numbers
! Written by siva@cse.iitb.ernet.in, Aug 7, 2000
! This file uses a variation of the "bubble" sort approach.
! It makes repeated passes through the array exchanging
! marks[i] and marks [i + 1] if they are out of order.
! until no more exchanges are possible.
Program mysort
! declare the array for reading input. assumed size < 500
Integer, dimension(500) :: marks
Integer :: size
! the flag that checks if any swaps are made
Logical :: swapflag
! a variable to use as counter when looping
Integer :: i
! another to count how many swaps are done
Integer :: nswap = 0
!first read in size and marks
Read (*,*) size
If ((size > 500)) Then
Write (*,*) "Sorry we handle max of 500 numbers"
Stop
End If
write (*,*) "reading ", size, " numbers."
DO i = 1, size
Read (*,*) marks(i)
End Do
write(*,*) "Have Read in ", size, " numbers. Thanks."
!keep going through the array and exchanging any out of
!order elements until no exchange is possible.
outer: DO
!initialize swapflag to fasle
swapflag = .false.
! now go through the array seeing if any swap is needed.
inner: Do i = 1, size - 1
if ((marks(i) > marks(i+1))) Then
! swap the marks
tmp = marks(i+1)
marks(i+1) = marks(i)
marks(i) = tmp
nswap = nswap + 1
! since we have swapped, we set swapflag to true
swapflag = .true.
end if
End Do inner
! if no swaps were needed, then array is in sorted order.
if (.NOT. swapflag) EXIT
End Do outer
! now it is sorted. print it out
DO i = 1, size
Write (*,*) marks(i)
End Do
Write (*,*) " This needed ", nswap, " swaps to sort."
End Program mysort