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 1 and 2) and two skip-swap passes (min_idx == i). Final array {1, 2, 4, 5, 8}.

Basic Implementation

basic.lua
local arr = {5, 1, 4, 2, 8}
local n = #arr
local i = 1
while i <= n - 1 do
	local min_idx = i
	local j = i + 1
	while j <= n do
		if arr[j] < arr[min_idx] then
			min_idx = j
		end
		j = j + 1
	end
	if min_idx ~= i then
		local tmp = arr[i]
		arr[i] = arr[min_idx]
		arr[min_idx] = tmp
	end
	i = i + 1
end
io.write("[")
for k = 1, #arr do
	if k > 1 then io.write(", ") end
	io.write(tostring(arr[k]))
end
io.write("]\n")

Complexity

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

Implementation notes

  • Lua: same loop shape as Python / Java / JavaScript / C++ / C / Go / Rust / C# / Kotlin / Swift / Scala / Ruby / PHP. The if min_idx ~= i guard is the canonical skip-swap variant from the lesson spec.
  • min_idx = i keeps the running-minimum invariant visible; the three-line local 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..n]`.
sorted prefix After each pass, `arr[1..i]` is the final sorted prefix.