¿Cómo ordenar un vector en Rust?

81

¿Cuál es el método recomendado actualmente para ordenar valores en un vector?

Maxim Sloyko
fuente

Respuestas:

88

Una porción mutable de elementos con un orden total tiene un sortmétodo.

Debido a que se Vec<T>implementa DerefMut<[T]>, puede llamar a este método directamente en un vector, por lo que vector.sort()funciona.

Chris Morgan
fuente
¿Cuáles son los requisitos para el tipo T? Recibo un error que dice "Vec <MyType> no implementa ningún método en el alcance llamado 'sort'". Sospecho que esto puede deberse a que no implementé algunos rasgos para MyType, tengo cmp :: PartialEq y cmp :: PartialOrd hasta ahora.
Maxim Sloyko
9
También existe el sort_bymétodo que permite un predicado completamente personalizado.
huon
9
Como dicen los documentos, self.sort()== self.sort_by(|a, b| a.cmp(b)).
Chris Morgan
1
Puede simplemente llamar .sort()si el tipo Timplementa el cmp::Ordrasgo.
Simon Zyx
1
También puede echarle un vistazo a sort_unstableque es un poco más rápido, pero podría reordenar elementos "iguales"
Bogdan Mart
1

Si bien las soluciones propuestas anteriormente pueden ordenar vectores de números enteros, tuve problemas para ordenar vectores de flotantes.

La solución más simple fue utilizar la caja quickersort , que también puede clasificar flotadores. La caja de clasificación rápida también puede clasificar otros vectores de cualquier tipo y también implementa métodos para clasificar mediante comparaciones (sort_by).

A continuación se muestra el código de Rust:

extern crate quickersort;
//let's create the vector with the values
let mut vals = Vec::new();
vals.push(31.2);
vals.push(31.2);
vals.push(10.0);
vals.push(100.4);
vals.push(4.1);
quickersort::sort_floats(&mut vals[..]); // sort the vector
Salvatore Cosentino
fuente
11
No debería necesitar una caja separada solo para clasificar los flotadores; por ejemplo, v.sort_by(|a, b| a.partial_cmp(b).unwrap_or(Ordering::Equal))debería funcionar con flotadores. (Dependiendo de lo que desee hacer con los NaN en la matriz, puede escribir una función de comparación más cuidadosa).
user4815162342
4
Tuve problemas para clasificar vectores de flotadores , por lo que ya hay preguntas y respuestas completas dedicadas a ese problema específico ( stackoverflow.com/q/26489701/155423 , stackoverflow.com/q/28247990/155423 , stackoverflow.com/q/ 37127209/155423 ).
Shepmaster