1
-
!! Provides an interface for performing an insertion sort on a vector
4
-
!! Provides an interface for performing an insertion sort on a vector
6
-
! At the Ith step, the first I-1 positions contain a sorted
7
-
! vector. We shall insert the Ith value into its place in that
8
-
! vector shifting up to produce a new vector of length I.
13
-
INTEGER, PRIVATE :: ILeft, IMiddle, IRight, I
16
-
MODULE PROCEDURE Sort_sngl, Sort_dble, Sort_cmplx
21
42*
SUBROUTINE Sort_sngl( x, N )
22
-
!! Subroutine to perform an insertion sort on a vector (single)
24
-
INTEGER, INTENT( IN ) :: N
25
-
REAL, INTENT( INOUT ) :: x(:)
28
42
IF ( N == 1 ) RETURN
34
3304*
IF ( xTemp < x( 1 ) ) THEN
35
#####
x( 2 : I ) = x( 1 : I - 1 )
36
#####
x( 1 ) = xTemp ! goes in the first position
37
3304*
ELSE IF ( xTemp < x( I - 1 ) ) THEN ! Binary search for its place
42
#####
DO WHILE ( IRight > ILeft + 1 )
43
#####
IMiddle = ( ILeft + IRight ) / 2
44
#####
IF ( xTemp < x( IMiddle ) ) THEN
45
#####
IRight = IMiddle
52
#####
x( IRight + 1 : I ) = x( IRight : I - 1 )
53
#####
x( IRight ) = xTemp
59
-
END SUBROUTINE Sort_sngl
61
-
! ________________________________________________________________________
63
14*
SUBROUTINE Sort_dble( x, N )
64
-
!! Subroutine to perform an insertion sort on a vector (double)
66
-
INTEGER, INTENT( IN ) :: N
67
-
REAL (KIND=8), INTENT( INOUT ) :: x(:)
68
-
REAL (KIND=8) :: xTemp
70
14*
IF ( N == 1 ) RETURN
76
55936*
IF ( xTemp < x( 1 ) ) THEN
77
#####
x( 2 : I ) = x( 1 : I - 1 )
78
#####
x( 1 ) = xTemp ! goes in the first position
79
55936*
ELSE IF ( xTemp < x( I - 1 ) ) THEN ! Binary search for its place
84
#####
DO WHILE ( IRight > ILeft + 1 )
85
#####
IMiddle = ( ILeft + IRight ) / 2
86
#####
IF ( xTemp < x( IMiddle ) ) THEN
87
#####
IRight = IMiddle
94
#####
x( IRight + 1 : I ) = x( IRight : I - 1 )
95
#####
x( IRight ) = xTemp
101
-
END SUBROUTINE Sort_dble
103
-
! ________________________________________________________________________
105
#####
SUBROUTINE Sort_cmplx( x, N )
106
-
!! Subroutine to perform an insertion sort on a vector (complex, double)
108
-
! Based on order of decreasing real part
110
-
INTEGER, INTENT( IN ) :: N
111
-
COMPLEX (KIND=8), INTENT( INOUT ) :: x( N )
112
-
COMPLEX (KIND=8) :: xTemp
114
#####
IF ( N == 1 ) RETURN
120
#####
IF ( REAL( xTemp ) > REAL( x( 1 ) ) ) THEN
121
#####
x( 2 : I ) = x( 1 : I - 1 )
122
#####
x( 1 ) = xTemp ! goes in the first position
123
#####
ELSE IF ( REAL( xTemp ) > REAL( x( I - 1 ) ) ) THEN ! Binary search for its place
128
#####
DO WHILE ( IRight > ILeft + 1 )
129
#####
IMiddle = ( ILeft + IRight ) / 2
131
#####
IF ( REAL( xTemp ) > REAL( x( IMiddle ) ) ) THEN
132
#####
IRight = IMiddle
134
#####
ILeft = IMiddle
138
#####
x( IRight + 1 : I ) = x( IRight : I - 1 )
139
#####
x( IRight ) = xTemp
145
-
END SUBROUTINE Sort_cmplx