PROGRAM vecgen ! ! This program reads in a vector from the file vector.dat, with the ! first line being the number of elements in V, and all other entries ! being the data for V, and then sorts it from greatest-to-least, ! and writes the sorted vector to vecsorted.dat. ! IMPLICIT NONE INTEGER N DOUBLE PRECISION, ALLOCATABLE :: V(:) EXTERNAL :: vecsort OPEN(unit=10, file='vector.dat', status='old', action='read') READ (10,*) N PRINT *, 'N read in as:', N IF (N .lt. 1) THEN PRINT*, 'N must be greater than 0, but you used:', N STOP END IF ! ! Allocate array, read in V, and close file ! ALLOCATE(V(N)) ! allocate array READ(10, *) V CLOSE(10) ! ! Sort the array ! call vecsort(N, V) ! ! Write sorted array out, and if it is small, print vector to screen ! OPEN(unit=10, file='vecsorted.dat', status='replace', action='write') WRITE(10,*) N WRITE(10,*) V CLOSE(10) IF (N .LT. 8) PRINT *, V DEALLOCATE(V) PRINT *, 'Sorted vector written to file ''vecsorted.dat''' END PROGRAM vecgen SUBROUTINE vecsort(N, Y) IMPLICIT NONE INTEGER, INTENT(IN) :: N DOUBLE PRECISION, INTENT(INOUT) :: Y(*) INTEGER :: i, j, imax DOUBLE PRECISION :: mymax ! ! sort array from greatest-to-least using selection sort ! DO j=1, N-1 ! j points to position to find the largest # in mymax = Y(j) imax = j DO i = j+1, N ! loop over all positions to right of sorted array IF (Y(i) .gt. mymax) THEN mymax = Y(i) imax = i END IF END DO IF (imax .NE. j) THEN ! if greatest remeaning elt not already in pos j Y(imax) = Y(j) ! then swap them Y(j) = mymax END IF END DO END SUBROUTINE vecsort