function quickselect(arr, k, left, right) { left = left || 0; right = right || arr.length - 1;
while (right > left) { if (right - left > 600) { const n = right - left + 1; const m = k - left + 1; const z = Math.log(n); const s = 0.5 * Math.exp((2 * z) / 3); let sd = 0.5 * Math.sqrt((z * s * (n - s)) / n); if (m - n / 2 < 0) sd *= -1; const newLeft = Math.max(left, Math.floor(k - (m * s) / n + sd)); const newRight = Math.min( right, Math.floor(k + ((n - m) * s) / n + sd) ); quickselect(arr, k, newLeft, newRight); }
const t = arr[k]; let i = left; let j = right;
swap(arr, left, k); if (arr[right] > t) swap(arr, left, right);
while (i < j) { swap(arr, i, j); i++; j--; while (arr[i] < t) i++; while (arr[j] > t) j--; }
if (arr[left] === t) swap(arr, left, j); else { j++; swap(arr, j, right); }
if (j <= k) left = j + 1; if (k <= j) right = j - 1; }}
function swap(arr, i, j) { const tmp = arr[i]; arr[i] = arr[j]; arr[j] = tmp;}
export default quickselect;