Batchers Odd-Even Mergesort

Sorting network style.

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

How it works

Sorting network style.

Implementation

function oddEvenMergeSort(arr, stats) {
  const n = arr.length;
  if (n <= 1) return;
  let t = Math.ceil(Math.log2(n));
  let p = Math.pow(2, t - 1);
  while (p > 0) {
    let q = Math.pow(2, t - 1);
    let r = 0;
    let d = p;
    while (d > 0) {
      for (let i = 0; i < n - d; i++) {
        if ((i & p) === r) {
          compare(i, i + d);
          if (arr[i] > arr[i + d]) {
            [arr[i], arr[i + d]] = [arr[i + d], arr[i]];
            swap(i, i + d);
          }
        }
      }
      d = q - p;
      q = q / 2;
      r = p;
    }
    p = Math.floor(p / 2);
  }
  for (let i = 0; i < n; i++) markSorted(i);
}