Dual-Pivot Quick Sort

Uses two pivots to partition into three segments. Used by Java Arrays.sort() for primitives. Fewer swaps on average.

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

Uses two pivots to partition into three segments. Used by Java Arrays.sort() for primitives. Fewer swaps on average.

Implementation

function dualPivotQuickSort(arr, lo = 0, hi = arr.length-1) {
  if (lo >= hi) return;
  if (arr[lo] > arr[hi]) [arr[lo], arr[hi]] = [arr[hi], arr[lo]];
  let p = arr[lo], q = arr[hi];
  let lt = lo + 1, gt = hi - 1, k = lt;
  while (k <= gt) {
    if (arr[k] < p) { [arr[k], arr[lt]] = [arr[lt], arr[k]]; lt++; }
    else if (arr[k] > q) {
      while (arr[gt] > q && k < gt) gt--;
      [arr[k], arr[gt]] = [arr[gt], arr[k]]; gt--;
      if (arr[k] < p) { [arr[k], arr[lt]] = [arr[lt], arr[k]]; lt++; }
    }
    k++;
  }
  lt--; gt++;
  [arr[lo], arr[lt]] = [arr[lt], arr[lo]];
  [arr[hi], arr[gt]] = [arr[gt], arr[hi]];
  dualPivotQuickSort(arr, lo, lt - 1);
  dualPivotQuickSort(arr, lt + 1, gt - 1);
  dualPivotQuickSort(arr, gt + 1, hi);
}