Go Program for Bubble Sort with Example and Explanation
for loops to repeatedly swap adjacent elements if they are in the wrong order, like for i := 0; i < n-1; i++ { for j := 0; j < n-i-1; j++ { if arr[j] > arr[j+1] { arr[j], arr[j+1] = arr[j+1], arr[j] } } }.Examples
How to Think About It
Algorithm
Code
package main import "fmt" func bubbleSort(arr []int) { n := len(arr) for i := 0; i < n-1; i++ { for j := 0; j < n-i-1; j++ { if arr[j] > arr[j+1] { arr[j], arr[j+1] = arr[j+1], arr[j] } } } } func main() { arr := []int{5, 3, 8, 4, 2} bubbleSort(arr) fmt.Println(arr) }
Dry Run
Let's trace the array [5, 3, 8, 4, 2] through the bubble sort code.
First pass comparisons and swaps
Compare 5 and 3, swap -> [3, 5, 8, 4, 2]; compare 5 and 8, no swap; compare 8 and 4, swap -> [3, 5, 4, 8, 2]; compare 8 and 2, swap -> [3, 5, 4, 2, 8]
Second pass comparisons and swaps
Compare 3 and 5, no swap; compare 5 and 4, swap -> [3, 4, 5, 2, 8]; compare 5 and 2, swap -> [3, 4, 2, 5, 8]
Third pass comparisons and swaps
Compare 3 and 4, no swap; compare 4 and 2, swap -> [3, 2, 4, 5, 8]
Fourth pass comparisons and swaps
Compare 3 and 2, swap -> [2, 3, 4, 5, 8]
| Pass | Array State After Pass |
|---|---|
| 1 | [3 5 4 2 8] |
| 2 | [3 4 2 5 8] |
| 3 | [3 2 4 5 8] |
| 4 | [2 3 4 5 8] |
Why This Works
Step 1: Compare adjacent elements
The code uses if arr[j] > arr[j+1] to check if two neighbors are out of order.
Step 2: Swap if needed
If the left element is bigger, it swaps places with the right one using arr[j], arr[j+1] = arr[j+1], arr[j].
Step 3: Repeat passes
The outer loop repeats the process, shrinking the range each time because the largest elements settle at the end.
Alternative Approaches
package main import "fmt" func bubbleSortOptimized(arr []int) { n := len(arr) for i := 0; i < n-1; i++ { swapped := false for j := 0; j < n-i-1; j++ { if arr[j] > arr[j+1] { arr[j], arr[j+1] = arr[j+1], arr[j] swapped = true } } if !swapped { break } } } func main() { arr := []int{5, 3, 8, 4, 2} bubbleSortOptimized(arr) fmt.Println(arr) }
package main import ( "fmt" "sort" ) func main() { arr := []int{5, 3, 8, 4, 2} sort.Ints(arr) fmt.Println(arr) }
Complexity: O(n^2) time, O(1) space
Time Complexity
Bubble sort uses nested loops, each running up to n times, resulting in O(n^2) time in the worst and average cases.
Space Complexity
It sorts the array in place, so it uses only O(1) extra space.
Which Approach is Fastest?
Using Go's built-in sort is fastest for real use, while optimized bubble sort can be faster than basic bubble sort on nearly sorted data.
| Approach | Time | Space | Best For |
|---|---|---|---|
| Basic Bubble Sort | O(n^2) | O(1) | Learning and small datasets |
| Optimized Bubble Sort | O(n) best, O(n^2) worst | O(1) | Nearly sorted data |
| Go's sort.Ints | O(n log n) | O(log n) | All practical sorting needs |