面试题答案
一键面试Rust 冒泡排序实现
fn bubble_sort<T, F>(arr: &mut [T], compare: F)
where
T: Ord,
F: Fn(&T, &T) -> bool,
{
let len = arr.len();
for i in 0..len {
for j in 0..len - i - 1 {
if (compare)(&arr[j], &arr[j + 1]) {
arr.swap(j, j + 1);
}
}
}
}
闭包增强灵活性和可复用性的解释
- 灵活性:通过将比较逻辑作为闭包传入
bubble_sort
函数,我们可以轻松改变排序的标准。例如,如果我们有一个结构体数组,我们可以定义不同的闭包来根据结构体的不同字段进行排序。这意味着同一个bubble_sort
函数可以用于多种数据类型和不同的比较需求,而无需为每种情况都重写排序逻辑。 - 可复用性:闭包使得
bubble_sort
函数更通用。无论我们是要升序排序(比较逻辑为a > b
)还是降序排序(比较逻辑为a < b
),都可以通过传入不同的闭包来实现。这提高了bubble_sort
函数的复用性,它不再局限于单一的比较规则,而是可以适应各种比较场景。
示例使用
fn main() {
let mut numbers = vec![3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5];
bubble_sort(&mut numbers, |a, b| a > b);
println!("{:?}", numbers);
let mut strings = vec!["banana", "apple", "cherry"];
bubble_sort(&mut strings, |a, b| a.len() > b.len());
println!("{:?}", strings);
}
在上述示例中,我们对 numbers
数组进行降序排序,对 strings
数组按字符串长度降序排序,展示了闭包在增强灵活性和可复用性方面的作用。