pub fn bubble_sort<T: Ord>(arr: &mut [T]) {
// Iterate through the array, reducing the search range each pass
for i in 0..arr.len() {
let mut swapped = false;
// Last i elements are already sorted, skip them
for j in 0..(arr.len() - i - 1) {
// Compare adjacent elements and swap if needed
if arr[j] > arr[j + 1] {
arr.swap(j, j + 1);
swapped = true;
}
}
// Early exit if no swaps occurred - array is sorted
if !swapped {
break;
}
}
}
fn main() {
let mut numbers = [5, 2, 9, 1, 5, 6];
println!("Before: {:?}", numbers);
bubble_sort(&mut numbers);
println!("After: {:?}", numbers);
}
cHViIGZuIGJ1YmJsZV9zb3J0PFQ6IE9yZD4oYXJyOiAmbXV0IFtUXSkgewogICAgLy8gSXRlcmF0ZSB0aHJvdWdoIHRoZSBhcnJheSwgcmVkdWNpbmcgdGhlIHNlYXJjaCByYW5nZSBlYWNoIHBhc3MKICAgIGZvciBpIGluIDAuLmFyci5sZW4oKSB7CiAgICAgICAgbGV0IG11dCBzd2FwcGVkID0gZmFsc2U7CiAgICAgICAgCiAgICAgICAgLy8gTGFzdCBpIGVsZW1lbnRzIGFyZSBhbHJlYWR5IHNvcnRlZCwgc2tpcCB0aGVtCiAgICAgICAgZm9yIGogaW4gMC4uKGFyci5sZW4oKSAtIGkgLSAxKSB7CiAgICAgICAgICAgIC8vIENvbXBhcmUgYWRqYWNlbnQgZWxlbWVudHMgYW5kIHN3YXAgaWYgbmVlZGVkCiAgICAgICAgICAgIGlmIGFycltqXSA+IGFycltqICsgMV0gewogICAgICAgICAgICAgICAgYXJyLnN3YXAoaiwgaiArIDEpOwogICAgICAgICAgICAgICAgc3dhcHBlZCA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgLy8gRWFybHkgZXhpdCBpZiBubyBzd2FwcyBvY2N1cnJlZCAtIGFycmF5IGlzIHNvcnRlZAogICAgICAgIGlmICFzd2FwcGVkIHsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgfQp9CgpmbiBtYWluKCkgewogICAgbGV0IG11dCBudW1iZXJzID0gWzUsIDIsIDksIDEsIDUsIDZdOwogICAgcHJpbnRsbiEoIkJlZm9yZTogezo/fSIsIG51bWJlcnMpOwogICAgCiAgICBidWJibGVfc29ydCgmbXV0IG51bWJlcnMpOwogICAgcHJpbnRsbiEoIkFmdGVyOiAgezo/fSIsIG51bWJlcnMpOwp9
Before: [5, 2, 9, 1, 5, 6]
After: [1, 2, 5, 5, 6, 9]