co_sort

Crates.ioco_sort
lib.rsco_sort
version0.2.0
sourcesrc
created_at2019-02-28 14:19:12.82864
updated_at2019-02-28 15:08:09.3078
descriptionSort arrays given a permutation
homepage
repositoryhttps://github.com/leudz/co_sort
max_upload_size
id117781
size24,313
Dylan Ancel (leudz)

documentation

README

co_sort

Sort multiple arrays given a permutation.

LICENSE LICENSE Crates.io Documentation

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

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.

Commit count: 12

cargo fmt