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 (min_idx == i). Final array [1, 2, 4, 5, 8].

Basic Implementation

basic.rs
fn main() {
	let mut arr = [5, 1, 4, 2, 8];
	let n = arr.len();
	for i in 0..n-1 {
		let mut min_idx = i;
		for j in i+1..n {
			if arr[j] < arr[min_idx] {
				min_idx = j;
			}
		}
		if min_idx != i {
			let tmp = arr[i];
			arr[i] = arr[min_idx];
			arr[min_idx] = tmp;
		}
	}
	println!("{:?}", arr);
}

Complexity

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

Implementation notes

  • Rust: same loop shape as Python / Java / JavaScript / C++ / C / Go. The if min_idx != i guard is the canonical skip-swap variant from the lesson spec.
  • let mut min_idx = i; keeps the running-minimum invariant visible; the three-line let tmp = arr[i]; arr[i] = arr[min_idx]; arr[min_idx] = tmp; swap mirrors the bubble-sort lesson.
  • The replay highlights the current min_idx distinctly from the scanning index j so the viewer sees the running minimum travel.
running minimum `min_idx` tracks the index of the smallest value seen in `arr[i..]`.
sorted prefix After each pass, `arr[0..i]` is the final sorted prefix.