比较函数
function less(a, b) { return a - b;}function greater(a, b) { return b - a; }
随机化分区
function partition(arr, l, r, comp = less) {  swap(arr, r, Math.floor(Math.rand()*(r - l) + l));  return partition_right(arr, l, r, comp);}
右边界分区
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;
}