Bubble Sort Algorithm in DSA Rust - Time & Space Complexity
We want to understand how the time taken by Bubble Sort changes as the list size grows.
How does the number of steps grow when sorting more items?
Analyze the time complexity of the following code snippet.
fn bubble_sort(arr: &mut [i32]) {
let n = arr.len();
for i in 0..n {
for j in 0..n - i - 1 {
if arr[j] > arr[j + 1] {
arr.swap(j, j + 1);
}
}
}
}
This code sorts an array by repeatedly swapping adjacent elements if they are in the wrong order.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: Comparing and possibly swapping adjacent elements inside nested loops.
- How many times: Outer loop runs n times, inner loop runs decreasing times from n-1 down to 1, so roughly n x n times.
As the list size grows, the number of comparisons grows much faster because each item is compared multiple times.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | About 45 comparisons |
| 100 | About 4,950 comparisons |
| 1000 | About 499,500 comparisons |
Pattern observation: The operations grow roughly by the square of the input size.
Time Complexity: O(n²)
This means if you double the number of items, the time taken roughly quadruples.
[X] Wrong: "Bubble Sort only takes time proportional to the number of items (O(n)) because it just looks at each item once."
[OK] Correct: Bubble Sort compares pairs many times in nested loops, so it does much more work than just one pass.
Understanding Bubble Sort's time complexity helps you appreciate why more efficient sorting methods are used in real projects.
"What if we add a flag to stop early when no swaps happen in a pass? How would the time complexity change in the best case?"
Practice
Bubble Sort algorithm?Solution
Step 1: Understand Bubble Sort process
Bubble Sort compares adjacent elements and swaps them if they are out of order.Step 2: Compare with other sorting methods
Other options describe different sorting algorithms like merge sort, selection sort, and insertion sort.Final Answer:
Repeatedly swap adjacent elements if they are in the wrong order -> Option BQuick Check:
Bubble Sort = swapping adjacent pairs [OK]
- Confusing Bubble Sort with Selection Sort
- Thinking it divides the list like Merge Sort
- Assuming it inserts elements like Insertion Sort
a[i] and a[i+1] in a vector a during Bubble Sort?Solution
Step 1: Identify Rust vector swap method
Rust vectors have a built-in methodswap(index1, index2)to swap elements safely.Step 2: Check other options for correctness
std::mem::swap(a[i], a[i + 1]); lacks mutable references and won't compile, swap(a[i], a[i + 1]); is invalid syntax with no such function, a[i], a[i + 1] = a[i + 1], a[i]; is invalid Python-style syntax in Rust.Final Answer:
a.swap(i, i + 1); -> Option CQuick Check:
Rust vector swap method = a.swap(i, i + 1) [OK]
- Using Python or C++ style swap syntax
- Trying to swap values directly without references
- Calling std::mem::swap on vector elements incorrectly
let mut a = vec![4, 3, 2, 1];
for i in 0..a.len() - 1 {
if a[i] > a[i + 1] {
a.swap(i, i + 1);
}
}
println!("{:?}", a);Solution
Step 1: Trace the single pass swaps
Start with [4, 3, 2, 1]. Compare pairs: - 4 > 3: swap -> [3, 4, 2, 1] - 4 > 2: swap -> [3, 2, 4, 1] - 4 > 1: swap -> [3, 2, 1, 4]Step 2: Final vector after one pass
After one pass, largest element 4 bubbles to the end. Vector is [3, 2, 1, 4].Final Answer:
[3, 2, 1, 4] -> Option AQuick Check:
One pass moves largest to end = [3, 2, 1, 4] [OK]
- Assuming full sort after one pass
- Not swapping correctly on each comparison
- Confusing indices and swapping wrong elements
let mut a = vec![5, 1, 4, 2, 8];
for i in 0..a.len() {
for j in 0..a.len() {
if a[j] > a[j + 1] {
a.swap(j, j + 1);
}
}
}Solution
Step 1: Identify out-of-bounds error
Inner loop uses j in 0..a.len(), so j+1 can be equal to a.len(), causing panic.Step 2: Fix inner loop range
Changing inner loop to 0..a.len() - 1 prevents accessing index out of range.Final Answer:
Change inner loop to 0..a.len() - 1 to avoid out-of-bounds -> Option AQuick Check:
Inner loop must stop before last index [OK]
- Not adjusting inner loop range causing panic
- Changing outer loop instead of inner loop
- Using wrong swap method causing compile error
vec![3, 0, -1, 5, 2], how many total swaps will Bubble Sort perform to fully sort the vector in ascending order?Solution
Step 1: Trace swaps pass by pass
Initial: [3, 0, -1, 5, 2] Pass 1 swaps: - 3 > 0 swap -> [0, 3, -1, 5, 2] - 3 > -1 swap -> [0, -1, 3, 5, 2] - 5 > 2 swap -> [0, -1, 3, 2, 5] Total swaps: 3Step 2: Continue passes and count swaps
Pass 2: - 0 > -1 no - -1 > 3 no - 3 > 2 swap -> [0, -1, 2, 3, 5] Total swaps: 1 Pass 3: - 0 > -1 no - -1 > 2 no No swaps Pass 4: No swaps Total swaps overall = 3 + 1 + 0 + 0 = 4 (recheck)Step 3: Recount carefully
Actually, in Pass 1, 3 > 0 swap (1), 3 > -1 swap (2), 5 > 2 swap (3) Pass 2, 0 > -1 no, -1 > 3 no, 3 > 2 swap (4) Pass 3, 0 > -1 no, -1 > 2 no Pass 4 no swaps Total swaps = 4Step 4: Check for missed swaps
Pass 2 also compares 2 and 3, no swap; Pass 3 no swaps; Pass 4 no swaps. But initial count missed the swap between 3 and 2 in Pass 2, and also the swap between 3 and 2 in Pass 2 is counted once. Total swaps = 4 as per trace.Step 5: Verify by counting inversions
Count inversions in initial array: (3,0), (3,-1), (3,2), (0,-1), (5,2) Total inversions = 5 Bubble Sort swaps equal to number of inversions, so total swaps = 5Final Answer:
5 -> Option DQuick Check:
Number of swaps equals number of inversions = 5 [OK]
- Counting comparisons instead of swaps
- Missing swaps in later passes
- Assuming swaps equal to length minus one
Ready to prove it?
Pass the test and this pattern moves unknown
