4 releases
0.2.0 | Feb 28, 2019 |
---|---|
0.1.2 | Feb 28, 2019 |
0.1.1 | Feb 28, 2019 |
0.1.0 | Feb 28, 2019 |
#1976 in Algorithms
863 downloads per month
Used in 9 crates
(2 directly)
14KB
206 lines
co_sort
Sort multiple arrays given a permutation.
The simplest way to use this crate is the co_sort! macro, it will sort the first array and swap elements of the others in order to mimic the changes in the first array.
Usefull when you have multiple slices with an implicit relation.
#[macro_use] extern crate co_sort;
use co_sort::*;
let mut names = ["Diego", "Maia", "Luciana", "Bruno", "Astrid", "Thierry"];
let mut ages = [ 73, 88, 21, 47, 4, 62 ];
// We want to sort the names but keep the ages synced
co_sort![names, ages];
assert_eq!(names, ["Astrid", "Bruno", "Diego", "Luciana", "Maia", "Thierry"]);
assert_eq!(ages, [ 4, 47, 73, 21, 88, 62 ]);
If you want more control you can use the functions co_sort and co_sort_stable, the macro uses co_sort internally.
co_sort_stable allocates O(n) memory and requires the types to implement Clone while co_sort is in place and doesn't require any trait.
Performance wise co_sort scale well with the number of arrays but not with their size and co_sort_stable is the opposite.
# use co_sort::*;
let mut names = ["Diego", "Maia", "Luciana", "Bruno", "Astrid", "Thierry"];
let mut ages = [ 73, 88, 21, 47, 4, 62 ];
let permutation = Permutation::from(names.as_ref());
permutation.co_sort((names.as_mut(), ages.as_mut()));
// or permutation.co_sort_stable((names.as_mut(), ages.as_mut()));
assert_eq!(names, ["Astrid", "Bruno", "Diego", "Luciana", "Maia", "Thierry"]);
assert_eq!(ages, [ 4, 47, 73, 21, 88, 62 ]);
License
Licensed under either of
- Apache License, Version 2.0 (LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0)
- MIT license (LICENSE-MIT or http://opensource.org/licenses/MIT)
at your option.
Contribution
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.