Subroutine to perform an insertion sort on a vector (complex, double)
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
complex(kind=8), | intent(inout) | :: | x(N) | |||
integer, | intent(in) | :: | N |
SUBROUTINE Sort_cmplx( x, N ) !! Subroutine to perform an insertion sort on a vector (complex, double) ! Based on order of decreasing real part INTEGER, INTENT( IN ) :: N COMPLEX (KIND=8), INTENT( INOUT ) :: x( N ) COMPLEX (KIND=8) :: xTemp IF ( N == 1 ) RETURN DO I = 2, N xTemp = x( I ) IF ( REAL( xTemp ) > REAL( x( 1 ) ) ) THEN x( 2 : I ) = x( 1 : I - 1 ) x( 1 ) = xTemp ! goes in the first position ELSE IF ( REAL( xTemp ) > REAL( x( I - 1 ) ) ) THEN ! Binary search for its place IRight = I - 1 ILeft = 1 DO WHILE ( IRight > ILeft + 1 ) IMiddle = ( ILeft + IRight ) / 2 IF ( REAL( xTemp ) > REAL( x( IMiddle ) ) ) THEN IRight = IMiddle ELSE ILeft = IMiddle END IF END DO x( IRight + 1 : I ) = x( IRight : I - 1 ) x( IRight ) = xTemp END IF END DO END SUBROUTINE Sort_cmplx