Guest User

Untitled

a guest
Dec 17th, 2018
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.04 KB | None | 0 0
  1. fn sort_with_index_by<T, U: Ord, F: FnMut(usize, &T) -> U>(slice: &mut [T], mut f: F) {
  2. let mut range: Vec<_> = (0..slice.len()).collect();
  3.  
  4. range.sort_by_key(|&x| f(x, &slice[x]));
  5.  
  6. fn sort_chain<T>(o: usize, n: usize, slice: &mut [T], range: &mut [usize]) {
  7. let i = range[n];
  8.  
  9. if i == o {
  10. slice.swap(o, n);
  11. range.swap(o, n);
  12. return;
  13. }
  14.  
  15. if i != n {
  16. sort_chain(o, i, slice, range);
  17. slice.swap(o, n);
  18. range.swap(o, n);
  19. }
  20. }
  21.  
  22. for i in 0..slice.len() {
  23. if range[i] != i {
  24. sort_chain(i, i, slice, &mut range);
  25. }
  26. }
  27. }
  28.  
  29. fn main() {
  30. let a = [1, 0, 3, 4, 2];
  31. let mut b = ['a', 'b', 'c', 'd', 'e'];
  32.  
  33. let mut i: Vec<_> = b.iter().cloned().enumerate().collect();
  34. i.sort_by_key(|&(i, _)| a[i]);
  35. let (_, t): (Vec<_>, Vec<_>) = i.into_iter().unzip();
  36.  
  37. println!("{:?}", t);
  38.  
  39. sort_with_index_by(&mut b, |i, _| a[i]);
  40.  
  41. println!("{:?}", b);
  42. }
Add Comment
Please, Sign In to add comment