Rust中向量的排序:面向初学者的完整指南(含示例)

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

如何在Rust中对向量进行排序:从新手到专家



想象一下:你正在用Rust编写一个程序,它需要收集用户列表——包括姓名、年龄和评分。数据以杂乱无章的顺序到达。你需要按字母顺序输出它们,或者按年龄排序。熟悉的任务吗?如果你浏览过Stack Overflow,你肯定见过“How to sort a vector in Rust?”这个问题——它已经积累了数千次浏览。这并非偶然。



在Rust中,排序是这样一个主题:如果你不了解一些细节,“直接调用sort()”可能行不通。在本文中,我们将介绍所有流行的向量排序方法:从基本的sort()方法到自定义比较器,以及在稳定排序和不稳定排序之间进行选择。你将学习如何正确、快速且无恐慌地在Rust中对向量进行排序。



基本方法:sort()——当一切都很简单时



对向量进行排序的最简单方法是使用sort()方法。它适用于实现了Ord trait的类型——这包括所有标准基本类型(数字、字符串、字符)。



fn main() {    let mut numbers = vec![4, 2, 9, 1, 5, 6];    numbers.sort();    println!("{:?}", numbers); // 输出: [1, 2, 4, 5, 6, 9]}


请注意:变量numbers被声明为mut(可变的)。sort()方法会就地修改向量,因此没有mut代码将无法编译。这是新手常犯的错误——忘记可变性。



字符串也是如此:



fn main() {    let mut fruits = vec!["banana", "apple", "cherry", "date"];    fruits.sort();    println!("{:?}", fruits); // 输出: ["apple", "banana", "cherry", "date"]}


默认的字符串排序是按字典顺序(字母顺序)。如果你需要按长度排序或忽略大小写,请阅读关于自定义比较器的部分。



sort_unstable():当速度比顺序更重要时



Rust中有两种排序方式:sort()(稳定排序)和sort_unstable()(不稳定排序)。区别在于,稳定排序会保留相等元素的相对顺序,而不稳定排序则不会。这听起来很学术,但在实践中,如果你正在对复杂结构进行排序并希望保留相等键的插入顺序,这一点很重要。



然而,sort_unstable()有一个优势:它运行得更快并且使用更少的内存。对于大型向量(数百万个元素),差异可能非常显著。



fn main() {    let mut scores = vec![85, 92, 85, 70, 92, 60];    scores.sort_unstable();    println!("{:?}", scores); // 输出: [60, 70, 85, 85, 92, 92]    // 两个85和两个92的顺序可能与原始顺序不同}


何时选择sort_unstable?如果你不关心相等元素的顺序并且追求性能,请使用它。如果可预测性很重要(例如,对具有多列的表进行排序),请使用sort()。



sort_by():自定义比较器



如果需要根据非标准规则对向量进行排序,该怎么办?例如,按降序排列数字、按长度排列字符串,或按某个字段对自定义结构体进行排序。为此,存在sort_by()方法,它接受一个闭包作为比较器。



比较器必须返回一个Ordering——选项之一:Less、Equal或Greater。获得此类结果的最简单方法是使用.cmp()或.partial_cmp()方法。



示例:按降序排列数字。



fn main() {    let mut numbers = vec![4, 2, 9, 1, 5];    numbers.sort_by(|a, b| b.cmp(a));    println!("{:?}", numbers); // 输出: [9, 5, 4, 2, 1]}


请注意:我们交换了a和b的位置——

博客

书籍推荐