Sorting
Selection Sort
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 ~= iguard is the canonical skip-swap variant from the lesson spec. min_idx = ikeeps the running-minimum invariant visible; the three-linelocal tmp = arr[i]; arr[i] = arr[min_idx]; arr[min_idx] = tmpswap mirrors the bubble-sort lesson.- The replay highlights the current
min_idxdistinctly from the scanning indexjso 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.