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.scala
object Main {
	def main(args: Array[String]): Unit = {
		val arr = Array(5, 1, 4, 2, 8)
		val n = arr.length
		for (i <- 0 until n - 1) {
			var minIdx = i
			for (j <- (i + 1) until n) {
				if (arr(j) < arr(minIdx)) {
					minIdx = j
				}
			}
			if (minIdx != i) {
				val tmp = arr(i)
				arr(i) = arr(minIdx)
				arr(minIdx) = tmp
			}
		}
		println(arr.mkString("[", ", ", "]"))
	}
}

Complexity

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

Implementation notes

  • Scala: same loop shape as Python / Java / JavaScript / C++ / C / Go / Rust / C# / Kotlin / Swift. The if (minIdx != i) guard is the canonical skip-swap variant from the lesson spec.
  • var minIdx = i keeps the running-minimum invariant visible; the three-line val tmp = arr(i); arr(i) = arr(minIdx); arr(minIdx) = tmp swap mirrors the bubble-sort lesson.
  • 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.