Як відсортувати вектор у Rust?


Відповіді:


92

Змінюваний фрагмент елементів із загальним впорядкуванням має sortметод.

Оскільки Vec<T>реалізує DerefMut<[T]>, ви можете викликати цей метод безпосередньо на вектор, тому це vector.sort()працює.


Які вимоги до типу Т? Я отримую повідомлення про помилку: "Vec <MyType> не реалізує жодного методу в області з іменем" сортування "". Я підозрюю, що це може бути тому, що я не реалізував деякі риси для MyType, я маю cmp :: PartialEq та cmp :: PartialOrd.
Максим Слойко

9
Існує також sort_byметод, який дозволяє повністю користувацький предикат.
huon

9
Як сказано в документах, self.sort()== self.sort_by(|a, b| a.cmp(b)).
Chris Morgan

1
Ви можете просто зателефонувати, .sort()якщо тип Tреалізує cmp::Ordознаку.
Саймон Зікс,

1
Ви також можете поглянути на sort_unstableце трохи швидше, але можете змінити порядок "рівних" елементів
Богдан Март

1

Хоча запропоновані вище рішення можуть сортувати вектори цілих чисел, у мене були проблеми з сортуванням векторів плаваючих значень.

Найпростішим рішенням було використання ящика для швидкого сортування, який також може сортувати поплавці. Ящик швидкого сортування може також сортувати інші вектори будь-якого типу, а також реалізує методи сортування за допомогою порівнянь (sort_by).

Нижче наведено код 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

11
Вам не знадобиться окремий ящик, щоб просто сортувати поплавці - наприклад, v.sort_by(|a, b| a.partial_cmp(b).unwrap_or(Ordering::Equal))слід працювати з поплавками. (Залежно від того, що ви хочете зробити з NaN у масиві, ви можете написати більш ретельну функцію порівняння.)
user4815162342

4
У мене виникли проблеми з сортуванням векторів плаваючих значень - ось чому вже є цілі запитання та відповіді, присвячені цій конкретній проблемі ( stackoverflow.com/q/26489701/155423 , stackoverflow.com/q/28247990/155423 , stackoverflow.com/q/ 37127209/155423 ).
Шепмастер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.