如何在Rust中对向量进行排序?

137

目前推荐的对向量进行排序的方法是什么?

3个回答

131
一种具有完全排序的可变元素切片具有 sort 方法。
由于 Vec<T> 实现了 DerefMut<[T]>,因此您可以直接在向量上调用此方法,因此 vector.sort() 可以工作。

T类型的要求是什么?我收到了一个错误,说“Vec<MyType>在范围内没有实现名为'sort'的任何方法”。我怀疑这可能是因为我没有为MyType实现一些特性,目前我只有cmp::PartialEq和cmp::PartialOrd。 - Maxim Sloyko
13
还有sort_by方法,它允许完全自定义的谓词。 - huon
15
根据文档,self.sort() 等同于 self.sort_by(|a, b| a.cmp(b)) - Chris Morgan
1
如果类型 T 实现了 cmp::Ord 特性,您可以直接调用 .sort() - Simon Zyx
2
你也可以看一下 sort_unstable,它会更快一些,但可能会重新排列“相等”的元素。 - Bogdan Mart

8
为了对一个向量v进行排序,在大多数情况下你需要使用v.sort()
如果你想应用自定义的排序规则,可以通过v.sort_by()来实现。这包括以下情况:
  • 不实现Ord(如f64、大多数结构体等)的值;
  • 实现Ord,但希望应用特定的非标准排序规则。
此外,请注意 sort()sort_by()使用稳定的排序算法(即,相等的元素不会被重新排序)。如果不需要稳定排序,则可以使用sort_unstable()/sort_unstable_by(),因为这些方法通常比较快且使用的内存更少。

-2

虽然上面提出的解决方案可以对整数向量进行排序,但我在对浮点数向量进行排序时遇到了问题。

最简单的解决方案是使用 quickersort crate,它也可以对浮点数进行排序。 quickersort crate还可以对其他任何类型的向量进行排序,并实现使用比较进行排序的方法(sort_by)。

以下是Rust代码:

extern crate quickersort;
//let's create the vector with the values
let mut vals = Vec::new();
vals.push(31.2);
vals.push(31.2);
vals.push(10.0);
vals.push(100.4);
vals.push(4.1);
quickersort::sort_floats(&mut vals[..]); // sort the vector

18
你不需要单独使用一个包来对浮点数进行排序 - 例如, v.sort_by(|a, b| a.partial_cmp(b).unwrap_or(Ordering::Equal)) 可以用于浮点数的排序。(取决于你想在数组中处理 NaN 的方式,你可以编写更谨慎的比较函数。) - user4815162342
5
我在对浮点数向量进行排序时遇到了问题,这也是为什么已经有了针对这个特定问题的整个问题和答案的原因(https://dev59.com/418d5IYBdhLWcg3wvkSN,https://dev59.com/OV4c5IYBdhLWcg3wLXga,https://dev59.com/15bfa4cB1Zd3GeqP0OQy)。 - Shepmaster

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接