【问题标题】:How to sort a vector in Rust?如何在 Rust 中对向量进行排序?
【发布时间】:2015-01-06 07:48:17
【问题描述】:

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

【问题讨论】:

    标签: rust


    【解决方案1】:

    具有总排序的可变元素切片具有sort 方法。

    因为Vec<T>实现了DerefMut<[T]>,所以可以直接在向量上调用这个方法,所以vector.sort()可以工作。

    【讨论】:

    • T型有什么要求?我收到一条错误消息,提示“Vec 没有在名为 'sort' 的范围内实现任何方法”。我怀疑这可能是因为我没有为 MyType 实现一些特征,到目前为止我有 cmp::PartialEq 和 cmp::PartialOrd。
    • 还有sort_by 方法,它允许完全自定义谓词。
    • 正如文档所说,self.sort() == self.sort_by(|a, b| a.cmp(b))
    • 如果T 类型实现了cmp::Ord trait,你可以直接调用.sort()
    • 你也可以看看sort_unstable,它更快一点,但可以重新排序“相等”的元素
    【解决方案2】:

    要对向量v 进行排序,在大多数情况下v.sort() 将是您所需要的。

    如果你想应用 custom 排序规则,你可以通过v.sort_by() 来实现。这包括您想要对以下值进行排序的情况:

    • 不要实现Ord(如f64,大多数结构等);
    • 执行Ord,但您想应用特定的非标准排序规则。

    还要注意sort()sort_by() 使用稳定 排序算法(即,相等的元素不会重新排序)。如果您不需要稳定的排序,可以使用sort_unstable() / sort_unstable_by(),因为它们通常会更快一些并且使用更少的内存。

    【讨论】:

      【解决方案3】:

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

      最简单的解决方案是使用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
      

      【讨论】:

      • 你不应该只需要一个单独的箱子来对浮点数进行排序 - 例如,v.sort_by(|a, b| a.partial_cmp(b).unwrap_or(Ordering::Equal)) 应该与浮点数一起使用。 (根据你想对数组中的NaN做什么,你可以写一个更仔细的比较函数。)
      • 我在对浮点向量进行排序时遇到了问题——这就是为什么已经有完整的问题和答案专门针对这个特定问题(stackoverflow.com/q/26489701/155423stackoverflow.com/q/28247990/155423stackoverflow.com/q/37127209/155423 )。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-02-15
      • 2011-12-12
      • 2021-05-26
      • 2014-09-29
      • 1970-01-01
      • 1970-01-01
      • 2019-10-10
      相关资源
      最近更新 更多