Loser Tree Sort

Tournament-tree k-way merge method optimized for repeatedly selecting next minimum.

Best O(n log k) Avg O(n log k) Worst O(n log k) Space O(k) Stable Yes In-place No Comparison-based

How it works

Tournament-tree k-way merge method optimized for repeatedly selecting next minimum.

Implementation

function loserTreeSort(arr, stats) {
  const n = arr.length;
  if (n < 2) return;
  const runSize = Math.max(8, Math.floor(Math.sqrt(n)));
  const runs = [];
  for (let i = 0; i < n; i += runSize) {
    const run = arr.slice(i, Math.min(i + runSize, n)).sort((a, b) => a - b);
    runs.push(run);
  }
  const k = runs.length;
  const loser = new Array(k).fill(-1);
  const idx = new Array(k).fill(0);
  let winner = -1;
  function value(i) {
    if (i < 0 || idx[i] >= runs[i].length) return Infinity;
    return runs[i][idx[i]];
  }
  function play(i) {
    let p = i + k >> 1;
    let w = i;
    while (p > 0) {
      const l = loser[p];
      if (l === -1) {
        loser[p] = w;
        w = -1;
        break;
      }
      if (value(w) > value(l)) {
        loser[p] = w;
        w = l;
      }
      p >>= 1;
    }
    if (w !== -1) winner = w;
  }
  for (let i = 0; i < k; i++) play(i);
  for (let out = 0; out < n; out++) {
    arr[out] = value(winner);
    write(out, arr[out]);
    idx[winner]++;
    play(winner);
  }
}