Ordenação de vetores em Rust: guia completo para iniciantes com exemplos

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Como ordenar um vetor em Rust: do iniciante ao profissional



Imagine: você está escrevendo um programa em Rust que coleta uma lista de usuários — nomes, idades, pontuação. Os dados chegam em ordem aleatória. Você precisa exibi-los em ordem alfabética ou, digamos, ordená-los por idade. Tarefa familiar? Se você já deu uma olhada no Stack Overflow, provavelmente viu a pergunta "How to sort a vector in Rust?" — ela acumulou milhares de visualizações. E isso não é por acaso.



Ordenação em Rust é um daqueles tópicos onde "apenas chamar sort()" pode não funcionar se você não conhecer alguns detalhes. Neste artigo, abordaremos todas as formas populares de ordenar um vetor: desde o método básico sort() até comparadores personalizados e a escolha entre ordenação estável e instável. Você aprenderá como ordenar um vetor em Rust corretamente, rapidamente e sem pânico.



Método básico: sort() — quando tudo é simples



A maneira mais simples de ordenar um vetor é usar o método sort(). Ele funciona para tipos que implementam a trait Ord — que são todos os primitivos padrão (números, strings, caracteres).



fn main() {    let mut numbers = vec![4, 2, 9, 1, 5, 6];    numbers.sort();    println!("{:?}", numbers); // Saída: [1, 2, 4, 5, 6, 9]}


Observe: a variável numbers é declarada como mut (mutável). O método sort() altera o vetor no local, portanto, sem mut o código não compilará. Este é um erro típico de iniciantes — esquecer a mutabilidade.



O mesmo funciona para strings:



fn main() {    let mut fruits = vec!["banana", "apple", "cherry", "date"];    fruits.sort();    println!("{:?}", fruits); // Saída: ["apple", "banana", "cherry", "date"]}


A ordenação de strings por padrão é lexicográfica (em ordem alfabética). Se você precisar de ordenação por comprimento ou ignorando maiúsculas/minúsculas — leia a seção sobre comparadores personalizados.



sort_unstable(): quando a velocidade é mais importante que a ordem



Em Rust, existem duas variantes de ordenação: sort() (estável) e sort_unstable() (instável). A diferença é que a ordenação estável mantém a ordem relativa de elementos iguais, enquanto a instável não. Parece acadêmico, mas na prática isso é importante se você estiver ordenando estruturas complexas e quiser preservar a ordem de inserção para chaves iguais.



No entanto, sort_unstable() tem uma vantagem: ela é mais rápida e usa menos memória. Para vetores grandes (milhões de elementos), a diferença pode ser significativa.



fn main() {    let mut scores = vec![85, 92, 85, 70, 92, 60];    scores.sort_unstable();    println!("{:?}", scores); // Saída: [60, 70, 85, 85, 92, 92]    // A ordem dos dois 85 e dois 92 pode diferir da original}


Quando escolher sort_unstable? Se a ordem dos elementos iguais não for importante e você estiver buscando desempenho. Se a previsibilidade for importante (por exemplo, ordenação de uma tabela com várias colunas), use sort().



sort_by(): comparadores personalizados



O que fazer se você precisar ordenar um vetor por uma regra não padrão? Por exemplo, números em ordem decrescente, strings por comprimento ou estruturas personalizadas por um dos campos. Para isso, existe o método sort_by(), que aceita uma closure como comparador.



O comparador deve retornar um Ordering — uma das opções: Less, Equal ou Greater. A maneira mais simples de obter esse resultado é usar os métodos .cmp() ou .partial_cmp().



Exemplo: ordenação de números em ordem decrescente.



fn main() {    let mut numbers = vec![4, 2, 9, 1, 5];    numbers.sort_by(|a, b| b.cmp(a));    println!("{:?}", numbers); // Saída: [9, 5, 4, 2, 1]}


Observe: trocamos a e b de lugar —

Blogs

Book Recommendations