Rust에서 벡터를 정렬하는 방법?


86

벡터에서 값을 정렬하기 위해 현재 권장되는 방법은 무엇입니까?

답변:


92

전체 순서가있는 가변 요소 조각에는 sort메서드가 있습니다.

Vec<T>구현 하기 DerefMut<[T]>때문에이 메서드를 벡터에서 직접 호출 할 수 있으므로 vector.sort()작동합니다.


T 유형의 요구 사항은 무엇입니까? "Vec <MyType>이 'sort'라는 범위의 메서드를 구현하지 않습니다."라는 오류가 표시됩니다. 나는 이것이 MyType에 대한 일부 특성을 구현하지 않았기 때문일 수 있으며 지금까지 cmp :: PartialEq 및 cmp :: PartialOrd가 있습니다.
Maxim Sloyko 2014

9
있다 sort_byA는 완전히 사용자 정의 술어 수도 방법.
후온

9
문서에서 말했듯이 self.sort()== self.sort_by(|a, b| a.cmp(b)).
Chris Morgan

1
.sort()유형 Tcmp::Ord특성을 구현하는 경우 호출 할 수 있습니다 .
Simon Zyx

1
당신은 또한 살펴 수 sort_unstable는 조금 더 빨리,하지만 "동일한"요소의 순서를 변경 할 수
보그 마트에게

1

위에서 제안한 솔루션은 정수 벡터를 정렬 할 수 있지만 부동 벡터를 정렬하는 데 문제가있었습니다.

가장 간단한 해결책은 수레를 정렬 할 수 있는 quickersort crate 를 사용하는 입니다. quickersort 크레이트는 또한 모든 유형의 다른 벡터를 정렬 할 수 있으며 비교 (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 ).
Shepmaster
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.