ADMB Documentation  -a65f1c97
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
dvsort2.cpp
Go to the documentation of this file.
1 /*
2  * $Id$
3  * Author: David Fournier
4  *
5  * Copyright (c) 2009 ADMB Foundation
6  */
7 #include <fvar.hpp>
8 
9 namespace admb_deprecated {
10 
20 dvector sort(const dvector& v, int NSTACK)
21 {
22  const int M=7;
23  const int FM=7875;
24  const int FA=211;
25  const int FC=1663;
26 
27  int n=v.size();
28  dvector arr(v.indexmin(),v.indexmax());
29  arr=v;
30  arr.shift(1);
31  int l=1,jstack=0,j,ir,iq,i;
32  ivector istack(1,NSTACK+1);
33  long int fx=0L;
34  double a;
35 
36  ir=n;
37  for (;;)
38  {
39  if (ir-l < M)
40  {
41  for (j=l+1;j<=ir;j++)
42  {
43  a=arr[j];
44  for (i=j-1;i>0 && arr[i]>a;i--) arr[i+1]=arr[i];
45  arr[i+1]=a;
46  }
47  if (jstack == 0)
48  {
49  arr.shift(v.indexmin());
50  return arr;
51  }
52  ir=istack[jstack--];
53  l=istack[jstack--];
54  }
55  else
56  {
57  i=l;
58  j=ir;
59  fx=(fx*FA+FC) % FM;
60  iq=l+((ir-l+1)*fx)/FM;
61  if (iq<=0)
62  {
63  iq=l+((ir-l+1.0)*fx)/FM;
64  }
65  a=arr[iq];
66  arr[iq]=arr[l];
67  for (;;)
68  {
69  while (j > 0 && a < arr[j]) j--;
70  if (j <= i)
71  {
72  arr[i]=a;
73  break;
74  }
75  arr[i++]=arr[j];
76  while (i <= n && a > arr[i] ) i++;
77  if (j <= i)
78  {
79  arr[(i=j)]=a;
80  break;
81  }
82  arr[j--]=arr[i];
83  }
84  if (ir-i >= i-l)
85  {
86  istack[++jstack]=i+1;
87  istack[++jstack]=ir;
88  ir=i-1;
89  } else
90  {
91  istack[++jstack]=l;
92  istack[++jstack]=i-1;
93  l=i+1;
94  }
95  if (jstack > NSTACK)
96  {
97  cerr << "Need to increase the stack in sort(const dvector&)\n";
98  ad_exit(1);
99  }
100  }
101  }
102 }
103 
114 dvector sort(const dvector& _v, const ivector& _index, int NSTACK)
115 {
116  const int M=7;
117  const int FM=7875;
118  const int FA=211;
119  const int FC=1663;
120  int iii;
121  ivector& index = (ivector&) _index;
122  dvector& v = (dvector&) _v;
123 
124  if (v.size() != index.size())
125  {
126  cerr << " Incompatible array sizes in vector v and ivector index\n"
127  << " in dvector sort(const dvector& v, const ivector& index)\n";
128  ad_exit(1);
129  }
130  int n=v.size();
131  int One=1;
132  int nne=v.indexmin();
133  index.fill_seqadd(nne,One);
134  dvector arr(v.indexmin(),v.indexmax());
135  arr=v;
136  arr.shift(1);
137  index.shift(1);
138  int l=1,jstack=0,j,ir,iq,i;
139  ivector istack(1,NSTACK+1);
140  long int fx=0L;
141  double a;
142 
143  ir=n;
144  int i1;
145  double tmp;
146  for (;;)
147  {
148  if (ir-l < M)
149  {
150  for (j=l+1;j<=ir;j++)
151  {
152  a=arr[j];
153  iii=index[j];
154  for (i=j-1;i>0;i--)
155  {
156  tmp=arr[i];
157  i1=i+1;
158  if (tmp <=a) break;
159  arr[i1]=tmp;
160  index[i1]=index[i];
161  }
162  arr[i+1]=a;
163  index[i+1]=iii;
164  }
165  if (jstack == 0)
166  {
167  arr.shift(v.indexmin());
168  index.shift(v.indexmin());
169  return arr;
170  }
171  ir=istack[jstack--];
172  l=istack[jstack--];
173  }
174  else
175  {
176  i=l;
177  j=ir;
178  fx=(fx*FA+FC) % FM;
179  iq=l+((ir-l+1)*fx)/FM;
180  if (iq<0)
181  {
182  iq=l+((ir-l+1.0)*fx)/FM;
183  }
184  a=arr[iq];
185  iii=index[iq];
186  arr[iq]=arr[l];
187  index[iq]=index[l];
188  for (;;)
189  {
190  while (j > 0 && a < arr[j]) j--;
191  if (j <= i)
192  {
193  arr[i]=a;
194  index[i]=iii;
195  break;
196  }
197  arr[i]=arr[j];
198  index[i++]=index[j];
199  while (i <= n && a > arr[i]) i++;
200  if (j <= i)
201  {
202  arr[(i=j)]=a;
203  index[i]=iii;
204  break;
205  }
206  arr[j]=arr[i];
207  index[j--]=index[i];
208  }
209  if (ir-i >= i-l)
210  {
211  istack[++jstack]=i+1;
212  istack[++jstack]=ir;
213  ir=i-1;
214  } else
215  {
216  istack[++jstack]=l;
217  istack[++jstack]=i-1;
218  l=i+1;
219  }
220  if (jstack > NSTACK)
221  {
222  cerr << "Need to increase the stack in sort(const dvector&)\n";
223  ad_exit(1);
224  }
225  }
226  }
227 }
228 
229 }
dvector sort(const dvector &v, int NSTACK)
Quicksort.
Definition: dvsort2.cpp:20
unsigned int size() const
Definition: ivector.h:109
Vector of double precision numbers.
Definition: dvector.h:50
int indexmin() const
Get minimum valid index.
Definition: dvector.h:199
exitptr ad_exit
Definition: gradstrc.cpp:53
void fill_seqadd(int, int)
Fills ivector elements with values starting from base and incremented by offset.
Definition: cranfill.cpp:73
Array of integers(int) with indexes from index_min to indexmax.
Definition: ivector.h:50
int indexmax() const
Get maximum valid index.
Definition: dvector.h:204
Author: David Fournier Copyright (c) 2008-2012 Regents of the University of California.
#define M
Definition: rngen.cpp:57
dvector & shift(int min)
Shift valid range of subscripts.
Definition: dvector.cpp:52
unsigned int size() const
Get number of elements in array.
Definition: dvector.h:209
ivector & shift(int min)
Author: David Fournier Copyright (c) 2008-2012 Regents of the University of California.
Definition: ivec.cpp:17