Ford-Johnson

Merge-insertion for minimum comparisons.

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

How it works

Merge-insertion for minimum comparisons.

Implementation

function fordJohnsonSort(arr) {
  if (arr.length <= 1) return;
  // Step 1: Pair elements, swap so larger first
  const pairs = [];
  for (let i = 0; i + 1 < arr.length; i += 2)
    pairs.push(arr[i] > arr[i+1] ? [arr[i], arr[i+1]] : [arr[i+1], arr[i]]);
  // Step 2: Recursively sort by winners (first of each pair)
  const winners = pairs.map(p => p[0]);
  fordJohnsonSort(winners);
  // Step 3: Insert losers using Jacobsthal order
  const chain = [...winners];
  const losers = pairs.map(p => p[1]);
  for (const idx of jacobsthalOrder(losers.length))
    binaryInsert(chain, losers[idx]);
}