Advertisement
Guest User

Untitled

a guest
Apr 19th, 2019
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.53 KB | None | 0 0
  1. fn main() {
  2. let sequence:Vec<i32> = (1..5).collect();
  3.  
  4. print_all_permutations(sequence);
  5. }
  6.  
  7. fn print_all_permutations(mut sequence:Vec<i32>) {
  8. sequence.sort();
  9.  
  10. println!("{:?}", sequence);
  11.  
  12. while let Some(k) = largest_k(&sequence) {
  13. //println!("k is: {}", k);
  14. let l = largest_l(&sequence, k);
  15. //println!("l is: {}", l);
  16. swap(&mut sequence, k, l);
  17. let n = sequence.len();
  18. reverse_range(&mut sequence, k+1, n);
  19. println!("{:?}", sequence);
  20. }
  21.  
  22. }
  23.  
  24. fn largest_k(arr:&Vec<i32>) -> Option<usize> {
  25. let mut result = None;
  26.  
  27. for k in 0..arr.len()-1 {
  28. if arr[k] < arr[k+1] {
  29. result = Some(k);
  30. }
  31. }
  32.  
  33. result
  34. }
  35.  
  36. fn largest_l(arr:&Vec<i32>, k:usize) -> usize {
  37. let mut result = 0;
  38.  
  39. for l in k+1..arr.len() {
  40. if arr[k] < arr[l] && l > result {
  41. result = l;
  42. }
  43. }
  44.  
  45. result
  46. }
  47.  
  48. fn swap( arr: &mut Vec<i32>, one:usize, two:usize) {
  49. //println!("swapping {} and {} in {:?}", arr[one], arr[two], arr);
  50. let temp = arr[two];
  51. arr[two] = arr[one];
  52. arr[one] = temp;
  53. //println!("swapped: {:?}", arr);
  54. }
  55.  
  56. fn reverse_range(arr: &mut Vec<i32> , range_start:usize, range_end:usize) {
  57. //println!("reversing from pos: {} to pos: {} in {:?}", range_start, range_end, arr);
  58. let mut rev = arr[range_start..range_end].to_vec();
  59. rev.reverse();
  60.  
  61. //println!("reversed slice is: {:?}", rev);
  62.  
  63. for (arr_i, rev_i) in (range_start..range_end).zip(0..arr.len()) {
  64. arr[arr_i] = rev[rev_i];
  65. }
  66. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement