Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- fn sort_with_index_by<T, U: Ord, F: FnMut(usize, &T) -> U>(slice: &mut [T], mut f: F) {
- let mut range: Vec<_> = (0..slice.len()).collect();
- range.sort_by_key(|&x| f(x, &slice[x]));
- fn sort_chain<T>(o: usize, n: usize, slice: &mut [T], range: &mut [usize]) {
- let i = range[n];
- if i == o {
- slice.swap(o, n);
- range.swap(o, n);
- return;
- }
- if i != n {
- sort_chain(o, i, slice, range);
- slice.swap(o, n);
- range.swap(o, n);
- }
- }
- for i in 0..slice.len() {
- if range[i] != i {
- sort_chain(i, i, slice, &mut range);
- }
- }
- }
- fn main() {
- let a = [1, 0, 3, 4, 2];
- let mut b = ['a', 'b', 'c', 'd', 'e'];
- let mut i: Vec<_> = b.iter().cloned().enumerate().collect();
- i.sort_by_key(|&(i, _)| a[i]);
- let (_, t): (Vec<_>, Vec<_>) = i.into_iter().unzip();
- println!("{:?}", t);
- sort_with_index_by(&mut b, |i, _| a[i]);
- println!("{:?}", b);
- }
Add Comment
Please, Sign In to add comment