当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Rust slice.sort_by用法及代码示例


本文简要介绍rust语言中 slice.sort_by 的用法。

用法

pub fn sort_by<F>(&mut self, compare: F) where    F: FnMut(&T, &T) -> Ordering,

使用比较器函数对切片进行排序。

这种排序是稳定的(即不重新排序相等的元素)和 O(n * log(n)) 最坏情况。

比较器函数必须定义切片中元素的总排序。如果排序不是总的,则元素的顺序是未指定的。如果订单是总订单(对于所有 abc ):

  • 完全和反对称: a < ba == ba > b 中的一个为 true,并且
  • 传递,a < bb < c 暗示 a < c==> 都必须如此。

例如,虽然 f64 没有实现 Ord 因为 NaN != NaN ,但当我们知道切片不包含 NaN 时,我们可以使用 partial_cmp 作为排序函数。

let mut floats = [5f64, 4.0, 1.0, 3.0, 2.0];
floats.sort_by(|a, b| a.partial_cmp(b).unwrap());
assert_eq!(floats, [1.0, 2.0, 3.0, 4.0, 5.0]);

在适用的情况下,首选不稳定排序,因为它通常比稳定排序更快,并且不分配辅助内存。见 sort_unstable_by

当前实施

当前算法是受timsort 启发的自适应迭代合并排序。它被设计为在切片几乎排序或由两个或多个依次连接的排序序列组成的情况下非常快。

此外,它分配的临时存储空间大小为 self 的一半,但对于短切片,则使用非分配插入排序。

例子

let mut v = [5, 4, 1, 3, 2];
v.sort_by(|a, b| a.cmp(b));
assert!(v == [1, 2, 3, 4, 5]);

// reverse sorting
v.sort_by(|a, b| b.cmp(a));
assert!(v == [5, 4, 3, 2, 1]);

相关用法


注:本文由纯净天空筛选整理自rust-lang.org大神的英文原创作品 slice.sort_by。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。