Сортировка вектора

Сортировка вектора целых чисел

std-badge cat-science-badge

Этот пример сортирует вектор целых чисел с помощью метода vec::sort. Альтернативой было бы использовать vec::sort_unstable, который может быть быстрее в некоторых случаях, но не гарантирует сохранение порядка равных элементов.

fn main() {
    let mut vec = vec![1, 5, 10, 2, 15];
    
    vec.sort();

    assert_eq!(vec, vec![1, 2, 5, 10, 15]);
}

Сортировка вектора вещественных чисел

std-badge cat-science-badge

Вектор из f32 or f64 может быть отсортирован с помощью методов vec::sort_by и PartialOrd::partial_cmp.

fn main() {
    let mut vec = vec![1.1, 1.15, 5.5, 1.123, 2.0];

    vec.sort_by(|a, b| a.partial_cmp(b).unwrap());

    assert_eq!(vec, vec![1.1, 1.123, 1.15, 2.0, 5.5]);
}

Сортировка вектора структур

std-badge cat-science-badge

Пример сортирует вектор персон (то есть структур типа Person) с полями name и age согласно естественному порядку (по имени и возрасту). Чтобы сделать структуру Person сортируемой, нам нужно реализовать четыре типажа: Eq, PartialEq, Ord and PartialOrd. Эти типажи могут быть просто реализованы автоматически с помощью аннотации derive. Мы можем также передать нашу функцию сравнения используя метод vec:sort_by и отсортировать только по возрасту.

#[derive(Debug, Eq, Ord, PartialEq, PartialOrd)]
struct Person {
    name: String,
    age: u32
}

impl Person {
    pub fn new(name: String, age: u32) -> Self {
        Person {
            name,
            age
        }
    }
}

fn main() {
    let mut people = vec![
        Person::new("Zoe".to_string(), 25),
        Person::new("Al".to_string(), 60),
        Person::new("John".to_string(), 1),
    ];

    // Sort people by derived natural order (Name and age)
    people.sort();

    assert_eq!(
        people,
        vec![
            Person::new("Al".to_string(), 60),
            Person::new("John".to_string(), 1),
            Person::new("Zoe".to_string(), 25),
        ]);

    // Sort people by age
    people.sort_by(|a, b| b.age.cmp(&a.age));

    assert_eq!(
        people,
        vec![
            Person::new("Al".to_string(), 60),
            Person::new("Zoe".to_string(), 25),
            Person::new("John".to_string(), 1),
        ]);

}