Ordenamiento de vectores en Rust: guía completa para principiantes con ejemplos

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Cómo ordenar un vector en Rust: de principiante a profesional



Imagine: está escribiendo un programa en Rust que recopila una lista de usuarios — nombres, edad, puntuación. Los datos llegan en un orden caótico. Necesita mostrarlos alfabéticamente o, digamos, ordenarlos por edad. ¿Le suena familiar? Si ha mirado en Stack Overflow, seguramente habrá visto la pregunta «How to sort a vector in Rust?» — que ha acumulado miles de visitas. Y no es casualidad.



Ordenar en Rust es uno de esos temas donde «simplemente llamar a sort()» puede no funcionar si no conoce un par de detalles. En este artículo, analizaremos todas las formas populares de ordenar un vector: desde el método básico sort() hasta comparadores personalizados y la elección entre ordenamiento estable e inestable. Aprenderá cómo ordenar un vector en Rust de forma correcta, rápida y sin pánico.



Método básico: sort() — cuando todo es simple



La forma más sencilla de ordenar un vector es usar el método sort(). Funciona para tipos que implementan el trait Ord — que son todos los primitivos estándar (números, cadenas, caracteres).



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


Tenga en cuenta: la variable numbers se declara como mut (mutable). El método sort() modifica el vector in situ, por lo que sin mut el código no compilará. Este es un error típico de principiantes: olvidar la mutabilidad.



Lo mismo funciona para cadenas:



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


El ordenamiento de cadenas por defecto es lexicográfico (alfabético). Si necesita ordenar por longitud o ignorando mayúsculas/minúsculas, lea la sección sobre comparadores personalizados.



sort_unstable(): cuando la velocidad es más importante que el orden



En Rust hay dos variantes de ordenamiento: sort() (estable) y sort_unstable() (inestable). La diferencia es que el ordenamiento estable conserva el orden relativo de los elementos iguales, mientras que el inestable no. Suena académico, pero en la práctica es importante si está ordenando estructuras complejas y desea conservar el orden de inserción para claves iguales.



Sin embargo, sort_unstable() tiene una ventaja: es más rápido y usa menos memoria. Para vectores grandes (millones de elementos), la diferencia puede ser significativa.



fn main() {    let mut scores = vec![85, 92, 85, 70, 92, 60];    scores.sort_unstable();    println!("{:?}", scores); // Salida: [60, 70, 85, 85, 92, 92]    // El orden de los dos 85 y los dos 92 puede diferir del original}


¿Cuándo elegir sort_unstable? Si no le importa el orden de los elementos iguales y busca rendimiento. Si la previsibilidad es importante (por ejemplo, ordenar una tabla con varias columnas), use sort().



sort_by(): comparadores personalizados



¿Qué hacer si necesita ordenar un vector según una regla no estándar? Por ejemplo, números en orden descendente, cadenas por longitud, o estructuras personalizadas por uno de sus campos. Para esto existe el método sort_by(), que acepta un closure como comparador.



El comparador debe devolver un Ordering — una de las variantes: Less, Equal o Greater. La forma más sencilla de obtener este resultado es usar los métodos .cmp() o .partial_cmp().



Ejemplo: ordenar números en orden descendente.



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


Tenga en cuenta: intercambiamos a y b —

Blogs

Book Recommendations