【发布时间】:2015-01-06 07:48:17
【问题描述】:
目前推荐对向量中的值进行排序的方法是什么?
【问题讨论】:
标签: rust
目前推荐对向量中的值进行排序的方法是什么?
【问题讨论】:
标签: rust
具有总排序的可变元素切片具有sort 方法。
因为Vec<T>实现了DerefMut<[T]>,所以可以直接在向量上调用这个方法,所以vector.sort()可以工作。
【讨论】:
sort_by 方法,它允许完全自定义谓词。
self.sort() == self.sort_by(|a, b| a.cmp(b))。
T 类型实现了cmp::Ord trait,你可以直接调用.sort()。
sort_unstable,它更快一点,但可以重新排序“相等”的元素
要对向量v 进行排序,在大多数情况下v.sort() 将是您所需要的。
如果你想应用 custom 排序规则,你可以通过v.sort_by() 来实现。这包括您想要对以下值进行排序的情况:
还要注意sort() 和sort_by() 使用稳定 排序算法(即,相等的元素不会重新排序)。如果您不需要稳定的排序,可以使用sort_unstable() / sort_unstable_by(),因为它们通常会更快一些并且使用更少的内存。
【讨论】:
虽然上面提出的解决方案可以对整数向量进行排序,但我在对浮点向量进行排序时遇到了问题。
最简单的解决方案是使用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做什么,你可以写一个更仔细的比较函数。)