Multikey Quicksort

3-way quicksort over key symbols/characters, ideal for string-like keys.

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

How it works

3-way quicksort over key symbols/characters, ideal for string-like keys.

Implementation

function multikeyQuickSort(arr, stats) {
  const records = arr.map((value, index) => ({
    value,
    key: String(value),
    index
  }));
  function charCodeAtOrNegOne(s, d) {
    return d < s.length ? s.charCodeAt(d) : -1;
  }
  function sort(lo, hi, d) {
    if (lo >= hi) return;
    let lt = lo;
    let gt = hi;
    const pivot = charCodeAtOrNegOne(records[lo].key, d);
    let i = lo + 1;
    while (i <= gt) {
      const code = charCodeAtOrNegOne(records[i].key, d);
      if (code < pivot) {
        const t = records[lt];
        records[lt] = records[i];
        records[i] = t;
        lt++;
        i++;
      } else if (code > pivot) {
        const t = records[i];
        records[i] = records[gt];
        records[gt] = t;
        gt--;
      } else {
        i++;
      }
    }
    sort(lo, lt - 1, d);
    if (pivot >= 0) sort(lt, gt, d + 1);
    sort(gt + 1, hi, d);
  }
  if (records.length > 1) sort(0, records.length - 1, 0);
  for (let i = 0; i < records.length; i++) {
    arr[i] = records[i].value;
    write(i, arr[i]);
  }
}