static void ex_int_iqsort(int v[], int iv[], int left, int right) { int pivot; int i, j; if (left + EX_QSORT_CUTOFF <= right) { pivot = ex_int_median3(v, iv, left, right); i = left; j = right - 1; for (;;) { while (v[iv[++i]] < v[pivot]) { ; } while (v[iv[--j]] > v[pivot]) { ; } if (i < j) { ex_swap(iv, i, j); } else { break; } } ex_swap(iv, i, right - 1); ex_int_iqsort(v, iv, left, i - 1); ex_int_iqsort(v, iv, i + 1, right); } }
static int ex_int_median3(int v[], int iv[], int left, int right) { int center; center = (left + right) / 2; if (v[iv[left]] > v[iv[center]]) ex_swap(iv, left, center); if (v[iv[left]] > v[iv[right]]) ex_swap(iv, left, right); if (v[iv[center]] > v[iv[right]]) ex_swap(iv, center, right); ex_swap(iv, center, right-1); return iv[right-1]; }
static void ex_int_iisort(int v[], int iv[], int N) { int i, j; int ndx = 0; int small; int tmp; small = v[iv[0]]; for (i = 1; i < N; i++) { if (v[iv[i]] < small) { small = v[iv[i]]; ndx = i; } } /* Put smallest value in slot 0 */ ex_swap(iv, 0, ndx); for (i = 1; i < N; i++) { tmp = iv[i]; for (j = i; v[tmp] < v[iv[j - 1]]; j--) { iv[j] = iv[j - 1]; } iv[j] = tmp; } }