Patience Sorting

Distribution sort using card game patience rules.

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

How it works

Distribution sort using card game patience rules.

Implementation

function patienceSort(arr, stats) {
  const n = arr.length;
  let piles = [];
  for (let i = 0; i < n; i++) {
    let card = arr[i];
    let left = 0, right = piles.length;
    while (left < right) {
      let mid = Math.floor((left + right) / 2);
      if (piles[mid][piles[mid].length - 1] > card) right = mid; else left = mid + 1;
    }
    if (left === piles.length) piles.push([card]); else piles[left].push(card);
    compare(i, i);
  }
  let outIdx = 0;
  while (piles.length > 0) {
    let minPile = 0;
    for (let i = 1; i < piles.length; i++) {
      if (piles[i][piles[i].length - 1] < piles[minPile][piles[minPile].length - 1]) {
        minPile = i;
      }
    }
    let val = piles[minPile].pop();
    if (piles[minPile].length === 0) piles.splice(minPile, 1);
    arr[outIdx] = val;
    write(outIdx, val);
    markSorted(outIdx);
    outIdx++;
  }
}