PROGRAM ASSIG_5_SOL

! This program contains a SUBROUTINE which implements Selection

! Sort using MAXVAL and MAXLOC and also it returns the original

! indices.

IMPLICIT NONE

INTEGER :: N

REAL, DIMENSION(:), ALLOCATABLE :: A

INTEGER, DIMENSION(:), ALLOCATABLE :: B

! Now read the dimension of A. Indices start at 1.

PRINT *, "Enter size of A:"

READ *, N

! Now allocate memory for A and B.

ALLOCATE(A(N), B(N))

! Now read elements of A.

PRINT *, "Enter elements of A:"

READ *, A

CALL NEW_SEL_SORT(A,B)

PRINT *, "Sorted Array: "

PRINT *, A

PRINT *, "Original Indices:"

PRINT *, B

! Now free memory allocated for A and B.

DEALLOCATE(A, B)

CONTAINS

        SUBROUTINE NEW_SEL_SORT(A,B)

                REAL, DIMENSION(:), INTENT(INOUT) :: A

                INTEGER, DIMENSION(:), INTENT(OUT) :: B

                INTEGER, DIMENSION(1) :: LOC_ARRAY

                INTEGER :: N, MAX_LOC, TMP

                REAL :: MAX_ELEM, I

                N=SIZE(A)

                DO I=1, N

                        B(I)=I

                END DO

                DO I=N, 2, -1

                        MAX_ELEM=MAXVAL(A(1:I))

                        LOC_ARRAY=MAXLOC(A(1:I))

                        MAX_LOC=LOC_ARRAY(1)

                        A(MAX_LOC)=A(I)

                        A(I)=MAX_ELEM

                        TMP=B(MAX_LOC)

                        B(MAX_LOC)=B(I)

                        B(I)=TMP

                END DO

        END SUBROUTINE NEW_SEL_SORT

END PROGRAM ASSIG_5_SOL