Làm thế nào để sắp xếp một vector trong Rust?


81

Phương pháp hiện được đề xuất để sắp xếp các giá trị trong một vectơ là gì?

Câu trả lời:


88

Một lát phần tử có thể thay đổi với tổng thứ tự có một sortphương thức.

Bởi vì Vec<T>thực hiện DerefMut<[T]>, bạn có thể gọi phương thức này trực tiếp trên một vectơ, vì vậy vector.sort()hoạt động.


Yêu cầu đối với loại T là gì? Tôi gặp lỗi cho biết "Vec <MyType> không triển khai bất kỳ phương thức nào trong phạm vi có tên 'sắp xếp'". Tôi nghi ngờ điều này có thể là do tôi đã không triển khai một số đặc điểm cho MyType, tôi có cmp :: PartialEq và cmp :: PartialOrd cho đến nay.
Maxim Sloyko

9
Có cả sort_byphương thức cho phép một vị từ hoàn toàn tùy chỉnh.
huon

9
Như các tài liệu nói, self.sort()== self.sort_by(|a, b| a.cmp(b)).
Chris Morgan

1
Bạn chỉ có thể gọi .sort()nếu kiểu Tthực hiện cmp::Ordđặc điểm.
Simon Zyx

1
Bạn cũng có thể xem xét sort_unstablenó chút nhanh hơn, nhưng có thể sắp xếp lại các yếu tố "bình đẳng"
Bogdan Mart

1

Trong khi các giải pháp được đề xuất ở trên có thể sắp xếp các vectơ của số nguyên, tôi đã gặp vấn đề trong việc sắp xếp các vectơ của số thực.

Giải pháp đơn giản nhất là sử dụng thùng phân loại nhanh, cũng có thể phân loại nổi. Thùng sắp xếp nhanh cũng có thể sắp xếp các vectơ khác thuộc bất kỳ loại nào và cũng thực hiện các phương pháp để sắp xếp bằng cách sử dụng so sánh (sort_by).

Sau đây là mã 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
Bạn không nên cần một thùng riêng chỉ để phân loại phao - ví dụ: v.sort_by(|a, b| a.partial_cmp(b).unwrap_or(Ordering::Equal))nên làm việc với phao. (Tùy thuộc vào những gì bạn muốn làm gì với Nans trong mảng, bạn có thể viết một hàm so sánh cẩn thận hơn.)
user4815162342

4
Tôi gặp sự cố khi sắp xếp các vectơ của float - đó là lý do tại sao đã có toàn bộ câu hỏi và câu trả lời dành riêng cho vấn đề cụ thể đó ( stackoverflow.com/q/26489701/155423 , stackoverflow.com/q/28247990/155423 , stackoverflow.com/q/ 37127209/155423 ).
Shepmaster
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.