比较函数

  1. function less(a, b) { return a - b;}
  2. function greater(a, b) { return b - a; }

随机化分区

  1. function partition(arr, l, r, comp = less) {
  2. swap(arr, r, Math.floor(Math.rand()*(r - l) + l));
  3. return partition_right(arr, l, r, comp);
  4. }

右边界分区

function partition_right(arr, l, r, comp = less) {
  let x = arr[r];
  let i = l, j = l;
  while (j < r) {
    if (comp(arr[j], x) <= 0) {
      i++;
        }
    j++;
  }
  swap(arr, i, r);
  return i;
}

三分区

function partition(arr, l, r, comp = less) {
  if (l + 1 >= r) return;
  let x = arr[l];
  let i = l;
  while (i < r) {
    if (comp(arr[i], x) === 0) {
      i++;
    } else if (comp(arr[i], x) > 0) {
      --r;
      swap(arr, i, r);
        } else if (comp(arr[i], x) < 0) {
      swap(arr, i, l);
      i++;
      l++;
    }
  }
  return l;
}