|
函数 bubble_sort 是一个经典的冒泡排序算法实现。
冒泡排序的基本思想是,对于数组中的相邻元素,如果前一个元素大于后一个元素,就交换它们的位置。
这样一轮下来,最大的元素就会"冒泡"到数组的末尾。重复这个过程,直到整个数组有序。
1 函数接收一个可变的i32类型数组切片作为参数
2 首先获取数组的长度n
3 使用双重循环进行排序:
外层循环(i)控制排序的轮数,每轮会将当前最大的元素"冒泡"到正确的位置
内层循环(j)进行相邻元素的比较和交换,范围从0到n-i-1,因为每轮结束后最后的i个元素已经有序
4 如果发现前一个元素大于后一个元素(arr[j] > arr[j+1]),就交换它们的位置
5 最终,数组会按从小到大的顺序排列
这个算法的时间复杂度是O(n²),空间复杂度是O(1)。虽然它不是最高效的排序算法,但实现简单,适合教学和小规模数据排序。
// 冒泡排序函数,可变引用(&mut) :arr 是一个可变引用 可以修改传入的数组
在Rust中,可变引用(&mut)是一个非常重要的概念,它允许你在不转移所有权的情况下修改数据。
1 基本概念:
可变引用使用 &mut 语法
它允许你借用数据并对其进行修改
同时确保内存安全
2 特点:
可变性:可以修改引用的数据
独占性:在同一个作用域内,只能有一个可变引用
临时性:引用只在作用域内有效
3 与不可变引用的区别:
不可变引用(&)只允许读取数据
可变引用(&mut)允许读取和修改数据
4 使用场景:
当需要修改数据但不想转移所有权时
在函数参数中传递需要修改的数据
在需要高效修改大型数据结构时
5 内存安全保证:
Rust编译器会确保不会同时存在可变引用和不可变引用
防止数据竞争
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);
}
}
}
}
fn main() {
let mut numbers = [64, 34, 25, 12, 22, 11, 90];
println!("排序前: {:?}", numbers);
bubble_sort(&mut numbers);
println!("排序后: {:?}", numbers);
}