BlockQuicksort

Quicksort variant using block partitioning to reduce branch mispredictions.

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

How it works

Quicksort variant using block partitioning to reduce branch mispredictions.

Implementation

function blockQuickSort(arr, stats) {
  function swap(i, j) {
    if (i === j) return;
    swap(i, j);
    const t = arr[i];
    arr[i] = arr[j];
    arr[j] = t;
  }
  function compareAndMaybeSwap(i, j) {
    compare(i, j);
    if (arr[i] > arr[j]) swap(i, j);
  }
  function partition(lo, hi) {
    const mid = lo + hi >> 1;
    compareAndMaybeSwap(lo, mid);
    compareAndMaybeSwap(lo, hi);
    compareAndMaybeSwap(mid, hi);
    const pivot = arr[hi];
    let store = lo;
    for (let i = lo; i < hi; i++) {
      compare(i, hi);
      if (arr[i] <= pivot) {
        swap(i, store);
        store++;
      }
    }
    swap(store, hi);
    return store;
  }
  if (arr.length < 2) return;
  const stack = [[0, arr.length - 1]];
  while (stack.length) {
    const range = stack.pop();
    let lo = range[0];
    let hi = range[1];
    while (lo < hi) {
      const p = partition(lo, hi);
      const leftSize = p - lo;
      const rightSize = hi - p;
      if (leftSize < rightSize) {
        if (p + 1 < hi) stack.push([p + 1, hi]);
        hi = p - 1;
      } else {
        if (lo < p - 1) stack.push([lo, p - 1]);
        lo = p + 1;
      }
    }
  }
}