Sorting
Bubble Sort
Repeatedly walk the array comparing adjacent pairs and swapping any that are
out of order. After pass k, the k largest elements are in their final
positions at the end. Stop early when a full pass makes zero swaps.
Algorithm
Canonical input [5, 1, 4, 2, 8] finishes after three passes: two with
swaps, then a clean pass that triggers the early exit. 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
var i = 0
var done = false
while (i < n - 1 && !done) {
var swapped = false
var j = 0
while (j < n - i - 1) {
if (arr(j) > arr(j + 1)) {
val tmp = arr(j)
arr(j) = arr(j + 1)
arr(j + 1) = tmp
swapped = true
}
j = j + 1
}
if (!swapped) {
done = true
}
i = i + 1
}
println(arr.mkString("[", ", ", "]"))
}
}
Complexity
- Time: O(n^2) worst and average; O(n) best (already sorted with early exit)
- Space: O(1)
- Stable: yes
Implementation notes
- Scala: explicit
whileloops withvar i,var j,var done, andvar swappedso the early-exit flow stays visible. The stdlibarr.sortedwould hide the comparison-and-swap the lesson is teaching, andscala.util.boundarywould obscure thedoneflag. - The explicit
val tmp = arr(j); arr(j) = arr(j+1); arr(j+1) = tmpthree-line swap keeps the move visible without leaning on tuple destructuring likeval (a, b) = (arr(j+1), arr(j)). - The replay distinguishes compare frames from swap frames so the
moving pivot value is visible. The pass number and
swappedflag appear in the trace.
adjacent-pair compare and swap
Inner loop walks `j` from `0` to `n - i - 2` comparing `arr(j)` and `arr(j + 1)`.
early exit
A `swapped` flag set false at the start of each pass. If no swap happened, flip a `done` flag and break out of the outer loop.