| 2333 | /* argsort */ |
| 2334 | |
| 2335 | static npy_intp |
| 2336 | npy_acount_run(char *arr, npy_intp *tosort, npy_intp l, npy_intp num, |
| 2337 | npy_intp minrun, size_t len, PyArray_CompareFunc *cmp, |
| 2338 | PyArrayObject *py_arr) |
| 2339 | { |
| 2340 | npy_intp sz; |
| 2341 | npy_intp vi; |
| 2342 | npy_intp *pl, *pi, *pj, *pr; |
| 2343 | |
| 2344 | if (NPY_UNLIKELY(num - l == 1)) { |
| 2345 | return 1; |
| 2346 | } |
| 2347 | |
| 2348 | pl = tosort + l; |
| 2349 | |
| 2350 | /* (not strictly) ascending sequence */ |
| 2351 | if (cmp(arr + (*pl) * len, arr + (*(pl + 1)) * len, py_arr) <= 0) { |
| 2352 | for (pi = pl + 1; |
| 2353 | pi < tosort + num - 1 && |
| 2354 | cmp(arr + (*pi) * len, arr + (*(pi + 1)) * len, py_arr) <= 0; |
| 2355 | ++pi) { |
| 2356 | } |
| 2357 | } |
| 2358 | else { /* (strictly) descending sequence */ |
| 2359 | for (pi = pl + 1; |
| 2360 | pi < tosort + num - 1 && |
| 2361 | cmp(arr + (*(pi + 1)) * len, arr + (*pi) * len, py_arr) < 0; |
| 2362 | ++pi) { |
| 2363 | } |
| 2364 | |
| 2365 | for (pj = pl, pr = pi; pj < pr; ++pj, --pr) { |
| 2366 | std::swap(*pj, *pr); |
| 2367 | } |
| 2368 | } |
| 2369 | |
| 2370 | ++pi; |
| 2371 | sz = pi - pl; |
| 2372 | |
| 2373 | if (sz < minrun) { |
| 2374 | if (l + minrun < num) { |
| 2375 | sz = minrun; |
| 2376 | } |
| 2377 | else { |
| 2378 | sz = num - l; |
| 2379 | } |
| 2380 | |
| 2381 | pr = pl + sz; |
| 2382 | |
| 2383 | /* insertion sort */ |
| 2384 | for (; pi < pr; ++pi) { |
| 2385 | vi = *pi; |
| 2386 | pj = pi; |
| 2387 | |
| 2388 | while (pl < pj && |
| 2389 | cmp(arr + vi * len, arr + (*(pj - 1)) * len, py_arr) < 0) { |
| 2390 | *pj = *(pj - 1); |
| 2391 | --pj; |
| 2392 | } |