三路快排和选择

July 26th, 2014, Saturday

quicksort three partition

C

void qsort_3part(Item a[], int l, int r) {
  if (r <= l) return;
  int i = l, j = r+1, p = l, q = r+1, k;
  Item v = a[l];

  while (i < j) {
    while (a[++i] < v);
    while (v < a[--j]);
    if (i < j) {
      exch(a[i], a[j]);
      if (a[i] == v) {
        p++;
        exch(a[p], a[i]);
      }
      if (a[j] == v) {
        q--;
        exch(a[q], a[j]);
      }
    }
  }
  exch(a[j], a[l]);
  i = j-1;
  j = j+1;
  for (k = l+1; k <= p; k++, i--) exch(a[k], a[i]);
  for (k = r; k >= q; k--, j++) exch(a[k], a[j]);
  qsort_3part(a, l, i);
  qsort_3part(a, j, r);
}

JS

Select

no recursion version

check function

Last updated