本文简要介绍rust语言中 slice.sort_unstable_by
的用法。
用法
pub fn sort_unstable_by<F>(&mut self, compare: F) where F: FnMut(&T, &T) -> Ordering,
使用比较器函数对切片进行排序,但可能不会保留相等元素的顺序。
这种排序是不稳定的(即可能对相等的元素重新排序)、就地(即不分配)和 O(n * log(n)) 最坏情况。
比较器函数必须定义切片中元素的总排序。如果排序不是总的,则元素的顺序是未指定的。如果订单是总订单(对于所有 a
、 b
和 c
):
- 完全和反对称:
a < b
、a == b
或a > b
中的一个为 true,并且 - 传递,
a < b
和b < c
暗示a < c
。==
和>
都必须如此。
例如,虽然 f64
没有实现 Ord
因为 NaN != NaN
,但当我们知道切片不包含 NaN
时,我们可以使用 partial_cmp
作为排序函数。
let mut floats = [5f64, 4.0, 1.0, 3.0, 2.0];
floats.sort_unstable_by(|a, b| a.partial_cmp(b).unwrap());
assert_eq!(floats, [1.0, 2.0, 3.0, 4.0, 5.0]);
当前实施
当前算法基于 Orson Peters 的pattern-defeating quicksort,它将随机快速排序的快速平均情况与堆排序的快速最坏情况结合起来,同时在具有某些模式的切片上实现线性时间。它使用一些随机化来避免退化情况,但使用固定种子始终提供确定性行为。
它通常比稳定排序快,除了在一些特殊情况下,例如,当切片由几个连接的排序序列组成时。
例子
let mut v = [5, 4, 1, 3, 2];
v.sort_unstable_by(|a, b| a.cmp(b));
assert!(v == [1, 2, 3, 4, 5]);
// reverse sorting
v.sort_unstable_by(|a, b| b.cmp(a));
assert!(v == [5, 4, 3, 2, 1]);
相关用法
- Rust slice.sort_unstable_by_key用法及代码示例
- Rust slice.sort_unstable用法及代码示例
- Rust slice.sort_by用法及代码示例
- Rust slice.sort_by_key用法及代码示例
- Rust slice.sort_by_cached_key用法及代码示例
- Rust slice.sort用法及代码示例
- Rust slice.swap_unchecked用法及代码示例
- Rust slice.split_array_mut用法及代码示例
- Rust slice.splitn_mut用法及代码示例
- Rust slice.split_first用法及代码示例
- Rust slice.splitn用法及代码示例
- Rust slice.split_array_ref用法及代码示例
- Rust slice.swap_with_slice用法及代码示例
- Rust slice.swap用法及代码示例
- Rust slice.split用法及代码示例
- Rust slice.split_inclusive用法及代码示例
- Rust slice.split_mut用法及代码示例
- Rust slice.strip_suffix用法及代码示例
- Rust slice.split_last_mut用法及代码示例
- Rust slice.split_first_mut用法及代码示例
- Rust slice.select_nth_unstable用法及代码示例
- Rust slice.split_at_mut用法及代码示例
- Rust slice.select_nth_unstable_by用法及代码示例
- Rust slice.split_at_unchecked用法及代码示例
- Rust slice.split_at用法及代码示例
注:本文由纯净天空筛选整理自rust-lang.org大神的英文原创作品 slice.sort_unstable_by。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。