Skip to main content

atcoder/lib/algorithm/
sort.rs

1//! 降順ソートの拡張メソッドです。
2
3/// `Ord` を実装する要素のスライスへ降順ソートを追加します。
4pub trait SortReverse {
5    /// スライス全体を安定な降順に並べ替えます。
6    ///
7    /// 比較で等しい要素同士の相対順序は保たれます。`N` は要素数で、計算量は `O(N log N)` です。
8    fn sort_reverse(&mut self);
9
10    /// スライス全体を安定性を保証せず降順に並べ替えます。
11    ///
12    /// 比較で等しい要素同士の相対順序は未規定です。`N` は要素数で、計算量は `O(N log N)` です。
13    fn sort_unstable_reverse(&mut self);
14}
15
16impl<T: Ord> SortReverse for [T] {
17    fn sort_reverse(&mut self) {
18        self.sort_by(|left, right| right.cmp(left));
19    }
20
21    fn sort_unstable_reverse(&mut self) {
22        self.sort_unstable_by(|left, right| right.cmp(left));
23    }
24}
25
26#[cfg(test)]
27mod tests {
28    use super::SortReverse;
29
30    #[test]
31    fn sorts_descending() {
32        let mut values = [2, 1, 3];
33        values.sort_unstable_reverse();
34        assert_eq!(values, [3, 2, 1]);
35    }
36}