Flashsort

Efficient distribution sort.

Best O(n) Avg O(n) Worst O(n^2) Space O(n) Stable No In-place Yes Distribution

How it works

Efficient distribution sort.

Implementation

function flashSort(arr, stats) {
  const n = arr.length;
  if (n < 2) return;
  let min = arr[0], max = 0;
  const m = Math.max(1, Math.floor(0.45 * n));
  let l = new Array(m).fill(0);
  for (let i = 1; i < n; i++) {
    if (arr[i] < min) min = arr[i];
    if (arr[i] > arr[max]) max = i;
  }
  if (min === arr[max]) return;
  let c1 = (m - 1) / (arr[max] - min);
  for (let j = 0; j < n; j++) {
    let k = Math.floor(c1 * (arr[j] - min));
    l[k]++;
  }
  for (let p = 1; p < m; p++) {
    l[p] = l[p] + l[p - 1];
  }
  let hold = arr[max];
  arr[max] = arr[0];
  arr[0] = hold;
  let move = 0, j = 0, k = m - 1;
  let flash;
  while (move < n - 1) {
    while (j > l[k] - 1) {
      j++;
      k = Math.floor(c1 * (arr[j] - min));
    }
    flash = arr[j];
    while (j !== l[k]) {
      k = Math.floor(c1 * (flash - min));
      hold = arr[l[k] - 1];
      arr[l[k] - 1] = flash;
      flash = hold;
      l[k]--;
      move++;
      write(l[k], arr[l[k]]);
    }
  }
  for (let i = 1; i < n; i++) {
    let hold = arr[i];
    let j = i - 1;
    while (j >= 0 && arr[j] > hold) {
      arr[j + 1] = arr[j];
      write(j + 1, arr[j + 1]);
      j--;
    }
    arr[j + 1] = hold;
    write(j + 1, hold);
  }
  for (let i = 0; i < n; i++) markSorted(i);
}