Sorting algorithms/Gnome sort: Difference between revisions

Content added Content deleted
m (→‎Starting from 2: Improved syntax.)
Line 1,590: Line 1,590:


end subroutine Gnomesort
end subroutine Gnomesort

Optimized Version

SUBROUTINE OPTIMIZEDGNOMESORT(A) ! Nice
IMPLICIT NONE
!
! Dummy arguments
!
REAL , DIMENSION(0:) :: A
INTENT (INOUT) A
!
! Local variables
!
INTEGER :: posy
!
DO posy = 1 , UBOUND(A , 1) !size(a)-1
CALL GNOMESORT(A , posy)
END DO
RETURN
CONTAINS
SUBROUTINE GNOMESORT(A , Upperbound)
IMPLICIT NONE
!
! Dummy arguments
!
INTEGER :: Upperbound
REAL , DIMENSION(0:) :: A
INTENT (IN) Upperbound
INTENT (INOUT) A
!
! Local variables
!
LOGICAL :: eval
INTEGER :: posy
REAL :: t
!
eval = .FALSE.
posy = Upperbound
eval = (posy>0) .AND. (A(posy - 1)>A(posy))
! do while ((posy > 0) .and. (a(posy-1) > a(posy)))
DO WHILE ( eval )
t = A(posy)
A(posy) = A(posy - 1)
A(posy - 1) = t
!
posy = posy - 1
eval = (posy>0)
IF( eval )THEN ! Have to use as a guard condition
eval = (A(posy - 1)>A(posy))
ELSE
eval = .FALSE.
END IF
END DO
RETURN
END SUBROUTINE GNOMESORT
END SUBROUTINE OPTIMIZEDGNOMESORT
!
end program example</lang>
end program example</lang>