本文簡要介紹rust語言中 slice.sort_by
的用法。
用法
pub fn sort_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_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 slice.sort_by_key用法及代碼示例
- Rust slice.sort_by_cached_key用法及代碼示例
- Rust slice.sort_unstable_by_key用法及代碼示例
- Rust slice.sort_unstable_by用法及代碼示例
- Rust slice.sort_unstable用法及代碼示例
- 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_by。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。