Repeatedly find the index of the smallest remaining element and swap it into the next "sorted prefix" slot. Unlike bubble sort, only one swap per pass.

Algorithm

Canonical input [5, 1, 4, 2, 8] finishes after four passes, with two real swaps (passes 0 and 1) and two skip-swap passes (minIdx === i). Final array [1, 2, 4, 5, 8].

Basic Implementation

basic.js
const arr = [5, 1, 4, 2, 8];
const n = arr.length;
for (let i = 0; i < n - 1; i++) {
    let minIdx = i;
    for (let j = i + 1; j < n; j++) {
        if (arr[j] < arr[minIdx]) {
            minIdx = j;
        }
    }
    if (minIdx !== i) {
        const tmp = arr[i];
        arr[i] = arr[minIdx];
        arr[minIdx] = tmp;
    }
}
console.log(JSON.stringify(arr));

Complexity

  • Time: O(n^2) regardless of input order
  • Space: O(1)
  • Stable: no
  • Swap count: at most n-1

Implementation notes

  • JavaScript: same loop shape as Python/Java. The if (minIdx !== i) guard is the canonical skip-swap variant from the lesson spec.
  • The replay highlights the current minIdx distinctly from the scanning index j so the viewer sees the running minimum travel.
running minimum `minIdx` tracks the index of the smallest value seen in `arr[i..]`.
sorted prefix After each pass, `arr[0..i]` is the final sorted prefix.