mirror of https://github.com/rust-lang/rust.git
Stabilize feature sort_unstable
This commit is contained in:
parent
d41b791c1a
commit
5350e22366
|
@ -1,40 +0,0 @@
|
|||
# `sort_unstable`
|
||||
|
||||
The tracking issue for this feature is: [#40585]
|
||||
|
||||
[#40585]: https://github.com/rust-lang/rust/issues/40585
|
||||
|
||||
------------------------
|
||||
|
||||
The default `sort` method on slices is stable. In other words, it guarantees
|
||||
that the original order of equal elements is preserved after sorting. The
|
||||
method has several undesirable characteristics:
|
||||
|
||||
1. It allocates a sizable chunk of memory.
|
||||
2. If you don't need stability, it is not as performant as it could be.
|
||||
|
||||
An alternative is the new `sort_unstable` feature, which includes these
|
||||
methods for sorting slices:
|
||||
|
||||
1. `sort_unstable`
|
||||
2. `sort_unstable_by`
|
||||
3. `sort_unstable_by_key`
|
||||
|
||||
Unstable sorting is generally faster and makes no allocations. The majority
|
||||
of real-world sorting needs doesn't require stability, so these methods can
|
||||
very often come in handy.
|
||||
|
||||
Another important difference is that `sort` lives in `libstd` and
|
||||
`sort_unstable` lives in `libcore`. The reason is that the former makes
|
||||
allocations and the latter doesn't.
|
||||
|
||||
A simple example:
|
||||
|
||||
```rust
|
||||
#![feature(sort_unstable)]
|
||||
|
||||
let mut v = [-5, 4, 1, -3, 2];
|
||||
|
||||
v.sort_unstable();
|
||||
assert!(v == [-5, -3, 1, 2, 4]);
|
||||
```
|
|
@ -1144,6 +1144,10 @@ impl<T> [T] {
|
|||
///
|
||||
/// This sort is stable (i.e. does not reorder equal elements) and `O(n log n)` worst-case.
|
||||
///
|
||||
/// When applicable, unstable sorting is preferred because it is generally faster than stable
|
||||
/// sorting and it doesn't allocate auxiliary memory.
|
||||
/// See [`sort_unstable`](#method.sort_unstable).
|
||||
///
|
||||
/// # Current implementation
|
||||
///
|
||||
/// The current algorithm is an adaptive, iterative merge sort inspired by
|
||||
|
@ -1174,6 +1178,10 @@ impl<T> [T] {
|
|||
///
|
||||
/// This sort is stable (i.e. does not reorder equal elements) and `O(n log n)` worst-case.
|
||||
///
|
||||
/// When applicable, unstable sorting is preferred because it is generally faster than stable
|
||||
/// sorting and it doesn't allocate auxiliary memory.
|
||||
/// See [`sort_unstable_by`](#method.sort_unstable_by).
|
||||
///
|
||||
/// # Current implementation
|
||||
///
|
||||
/// The current algorithm is an adaptive, iterative merge sort inspired by
|
||||
|
@ -1207,6 +1215,10 @@ impl<T> [T] {
|
|||
///
|
||||
/// This sort is stable (i.e. does not reorder equal elements) and `O(n log n)` worst-case.
|
||||
///
|
||||
/// When applicable, unstable sorting is preferred because it is generally faster than stable
|
||||
/// sorting and it doesn't allocate auxiliary memory.
|
||||
/// See [`sort_unstable_by_key`](#method.sort_unstable_by_key).
|
||||
///
|
||||
/// # Current implementation
|
||||
///
|
||||
/// The current algorithm is an adaptive, iterative merge sort inspired by
|
||||
|
@ -1251,8 +1263,6 @@ impl<T> [T] {
|
|||
/// # Examples
|
||||
///
|
||||
/// ```
|
||||
/// #![feature(sort_unstable)]
|
||||
///
|
||||
/// let mut v = [-5, 4, 1, -3, 2];
|
||||
///
|
||||
/// v.sort_unstable();
|
||||
|
@ -1260,8 +1270,7 @@ impl<T> [T] {
|
|||
/// ```
|
||||
///
|
||||
/// [pdqsort]: https://github.com/orlp/pdqsort
|
||||
// FIXME #40585: Mention `sort_unstable` in the documentation for `sort`.
|
||||
#[unstable(feature = "sort_unstable", issue = "40585")]
|
||||
#[stable(feature = "sort_unstable", since = "1.20.0")]
|
||||
#[inline]
|
||||
pub fn sort_unstable(&mut self)
|
||||
where T: Ord
|
||||
|
@ -1288,8 +1297,6 @@ impl<T> [T] {
|
|||
/// # Examples
|
||||
///
|
||||
/// ```
|
||||
/// #![feature(sort_unstable)]
|
||||
///
|
||||
/// let mut v = [5, 4, 1, 3, 2];
|
||||
/// v.sort_unstable_by(|a, b| a.cmp(b));
|
||||
/// assert!(v == [1, 2, 3, 4, 5]);
|
||||
|
@ -1300,8 +1307,7 @@ impl<T> [T] {
|
|||
/// ```
|
||||
///
|
||||
/// [pdqsort]: https://github.com/orlp/pdqsort
|
||||
// FIXME #40585: Mention `sort_unstable_by` in the documentation for `sort_by`.
|
||||
#[unstable(feature = "sort_unstable", issue = "40585")]
|
||||
#[stable(feature = "sort_unstable", since = "1.20.0")]
|
||||
#[inline]
|
||||
pub fn sort_unstable_by<F>(&mut self, compare: F)
|
||||
where F: FnMut(&T, &T) -> Ordering
|
||||
|
@ -1328,8 +1334,6 @@ impl<T> [T] {
|
|||
/// # Examples
|
||||
///
|
||||
/// ```
|
||||
/// #![feature(sort_unstable)]
|
||||
///
|
||||
/// let mut v = [-5i32, 4, 1, -3, 2];
|
||||
///
|
||||
/// v.sort_unstable_by_key(|k| k.abs());
|
||||
|
@ -1337,8 +1341,7 @@ impl<T> [T] {
|
|||
/// ```
|
||||
///
|
||||
/// [pdqsort]: https://github.com/orlp/pdqsort
|
||||
// FIXME #40585: Mention `sort_unstable_by_key` in the documentation for `sort_by_key`.
|
||||
#[unstable(feature = "sort_unstable", issue = "40585")]
|
||||
#[stable(feature = "sort_unstable", since = "1.20.0")]
|
||||
#[inline]
|
||||
pub fn sort_unstable_by_key<B, F>(&mut self, f: F)
|
||||
where F: FnMut(&T) -> B,
|
||||
|
|
|
@ -351,7 +351,7 @@ fn partition_in_blocks<T, F>(v: &mut [T], pivot: &T, is_less: &mut F) -> usize
|
|||
|
||||
if start_l < end_l {
|
||||
// The left block remains.
|
||||
// Move it's remaining out-of-order elements to the far right.
|
||||
// Move its remaining out-of-order elements to the far right.
|
||||
debug_assert_eq!(width(l, r), block_l);
|
||||
while start_l < end_l {
|
||||
unsafe {
|
||||
|
@ -363,7 +363,7 @@ fn partition_in_blocks<T, F>(v: &mut [T], pivot: &T, is_less: &mut F) -> usize
|
|||
width(v.as_mut_ptr(), r)
|
||||
} else if start_r < end_r {
|
||||
// The right block remains.
|
||||
// Move it's remaining out-of-order elements to the far left.
|
||||
// Move its remaining out-of-order elements to the far left.
|
||||
debug_assert_eq!(width(l, r), block_r);
|
||||
while start_r < end_r {
|
||||
unsafe {
|
||||
|
|
Loading…
Reference in New Issue