LAPACK  3.4.2
LAPACK: Linear Algebra PACKage
 All Files Functions Groups
dlamrg.f
Go to the documentation of this file.
1 *> \brief \b DLAMRG creates a permutation list to merge the entries of two independently sorted sets into a single set sorted in ascending order.
2 *
3 * =========== DOCUMENTATION ===========
4 *
5 * Online html documentation available at
6 * http://www.netlib.org/lapack/explore-html/
7 *
8 *> \htmlonly
9 *> Download DLAMRG + dependencies
10 *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/dlamrg.f">
11 *> [TGZ]</a>
12 *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/dlamrg.f">
13 *> [ZIP]</a>
14 *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/dlamrg.f">
15 *> [TXT]</a>
16 *> \endhtmlonly
17 *
18 * Definition:
19 * ===========
20 *
21 * SUBROUTINE DLAMRG( N1, N2, A, DTRD1, DTRD2, INDEX )
22 *
23 * .. Scalar Arguments ..
24 * INTEGER DTRD1, DTRD2, N1, N2
25 * ..
26 * .. Array Arguments ..
27 * INTEGER INDEX( * )
28 * DOUBLE PRECISION A( * )
29 * ..
30 *
31 *
32 *> \par Purpose:
33 * =============
34 *>
35 *> \verbatim
36 *>
37 *> DLAMRG will create a permutation list which will merge the elements
38 *> of A (which is composed of two independently sorted sets) into a
39 *> single set which is sorted in ascending order.
40 *> \endverbatim
41 *
42 * Arguments:
43 * ==========
44 *
45 *> \param[in] N1
46 *> \verbatim
47 *> N1 is INTEGER
48 *> \endverbatim
49 *>
50 *> \param[in] N2
51 *> \verbatim
52 *> N2 is INTEGER
53 *> These arguements contain the respective lengths of the two
54 *> sorted lists to be merged.
55 *> \endverbatim
56 *>
57 *> \param[in] A
58 *> \verbatim
59 *> A is DOUBLE PRECISION array, dimension (N1+N2)
60 *> The first N1 elements of A contain a list of numbers which
61 *> are sorted in either ascending or descending order. Likewise
62 *> for the final N2 elements.
63 *> \endverbatim
64 *>
65 *> \param[in] DTRD1
66 *> \verbatim
67 *> DTRD1 is INTEGER
68 *> \endverbatim
69 *>
70 *> \param[in] DTRD2
71 *> \verbatim
72 *> DTRD2 is INTEGER
73 *> These are the strides to be taken through the array A.
74 *> Allowable strides are 1 and -1. They indicate whether a
75 *> subset of A is sorted in ascending (DTRDx = 1) or descending
76 *> (DTRDx = -1) order.
77 *> \endverbatim
78 *>
79 *> \param[out] INDEX
80 *> \verbatim
81 *> INDEX is INTEGER array, dimension (N1+N2)
82 *> On exit this array will contain a permutation such that
83 *> if B( I ) = A( INDEX( I ) ) for I=1,N1+N2, then B will be
84 *> sorted in ascending order.
85 *> \endverbatim
86 *
87 * Authors:
88 * ========
89 *
90 *> \author Univ. of Tennessee
91 *> \author Univ. of California Berkeley
92 *> \author Univ. of Colorado Denver
93 *> \author NAG Ltd.
94 *
95 *> \date September 2012
96 *
97 *> \ingroup auxOTHERcomputational
98 *
99 * =====================================================================
100  SUBROUTINE dlamrg( N1, N2, A, DTRD1, DTRD2, INDEX )
101 *
102 * -- LAPACK computational routine (version 3.4.2) --
103 * -- LAPACK is a software package provided by Univ. of Tennessee, --
104 * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
105 * September 2012
106 *
107 * .. Scalar Arguments ..
108  INTEGER dtrd1, dtrd2, n1, n2
109 * ..
110 * .. Array Arguments ..
111  INTEGER index( * )
112  DOUBLE PRECISION a( * )
113 * ..
114 *
115 * =====================================================================
116 *
117 * .. Local Scalars ..
118  INTEGER i, ind1, ind2, n1sv, n2sv
119 * ..
120 * .. Executable Statements ..
121 *
122  n1sv = n1
123  n2sv = n2
124  IF( dtrd1.GT.0 ) THEN
125  ind1 = 1
126  ELSE
127  ind1 = n1
128  END IF
129  IF( dtrd2.GT.0 ) THEN
130  ind2 = 1 + n1
131  ELSE
132  ind2 = n1 + n2
133  END IF
134  i = 1
135 * while ( (N1SV > 0) & (N2SV > 0) )
136  10 continue
137  IF( n1sv.GT.0 .AND. n2sv.GT.0 ) THEN
138  IF( a( ind1 ).LE.a( ind2 ) ) THEN
139  index( i ) = ind1
140  i = i + 1
141  ind1 = ind1 + dtrd1
142  n1sv = n1sv - 1
143  ELSE
144  index( i ) = ind2
145  i = i + 1
146  ind2 = ind2 + dtrd2
147  n2sv = n2sv - 1
148  END IF
149  go to 10
150  END IF
151 * end while
152  IF( n1sv.EQ.0 ) THEN
153  DO 20 n1sv = 1, n2sv
154  index( i ) = ind2
155  i = i + 1
156  ind2 = ind2 + dtrd2
157  20 continue
158  ELSE
159 * N2SV .EQ. 0
160  DO 30 n2sv = 1, n1sv
161  index( i ) = ind1
162  i = i + 1
163  ind1 = ind1 + dtrd1
164  30 continue
165  END IF
166 *
167  return
168 *
169 * End of DLAMRG
170 *
171  END