Macaulay2 Engine
Loading...
Searching...
No Matches

◆ sortC()

template<typename Sorter>
void QuickSorter< Sorter >::sortC ( )
private

Definition at line 219 of file monsort.hpp.

223{
224 unsigned long i, ir = len, j, k, l = 1, *istack;
225 int jstack = 0;
226 value a, temp;
227 long ncmps;
228 int maxstack = 0;
229 ncmps = 0;
230 istack = newarray_atomic(unsigned long, NSTACK);
231 for (;;)
232 {
233 if (ir - l < THRESH)
234 {
235 for (j = l + 1; j <= ir; j++)
236 {
237 a = elems[j];
238 for (i = j - 1; i >= l; i--)
239 {
240 ncmps++;
241 if (M->compare(elems[i], a) <= 0) break;
242 elems[i + 1] = elems[i];
243 }
244 elems[i + 1] = a;
245 }
246 if (jstack == 0) break;
247 ir = istack[jstack--];
248 l = istack[jstack--];
249 }
250 else
251 {
252 k = (l + ir) >> 1;
253 SWAP(elems[k], elems[l + 1])
254 ncmps++;
255 if (M->compare(elems[l], elems[ir]) > 0)
256 {
257 SWAP(elems[l], elems[ir])
258 }
259 ncmps++;
260 if (M->compare(elems[l + 1], elems[ir]) > 0)
261 {
262 SWAP(elems[l + 1], elems[ir])
263 }
264 ncmps++;
265 if (M->compare(elems[l], elems[l + 1]) > 0)
266 {
267 SWAP(elems[l], elems[l + 1])
268 }
269 i = l + 1;
270 j = ir;
271 a = elems[l + 1];
272 for (;;)
273 {
274 do
275 i++;
276 while (ncmps++, M->compare(elems[i], a) < 0);
277 do
278 j--;
279 while (ncmps++, M->compare(elems[j], a) > 0);
280 if (j < i) break;
281 SWAP(elems[i], elems[j]);
282 }
283 elems[l + 1] = elems[j];
284 elems[j] = a;
285 jstack += 2;
287 if (jstack > NSTACK)
288 {
289 fprintf(stderr, "NSTACK too small in sort.\n");
290 exit(0);
291 }
292 if (ir - i + 1 >= j - l)
293 {
294 istack[jstack] = ir;
295 istack[jstack - 1] = i;
296 ir = j - 1;
297 }
298 else
299 {
300 istack[jstack] = j - 1;
301 istack[jstack - 1] = l;
302 l = i;
303 }
304 }
305 }
308 "quicksort: len = %ld ncmps = %ld 2*depth = %d\n",
309 len,
310 ncmps,
311 maxstack);
312}
Sorter * M
Definition monsort.hpp:50
value * elems
Definition monsort.hpp:51
Sorter::value value
Definition monsort.hpp:49
void freemem(void *s)
Definition m2-mem.cpp:103
#define SWAP(a, b)
Definition monsort.hpp:211
#define newarray_atomic(T, len)
Definition newdelete.hpp:91

References elems, freemem(), len, M, newarray_atomic, NSTACK, SWAP, and THRESH.

Referenced by sort().