pub fn lexicographically_next_permutation<T: PartialOrd + Copy>(a: &mut [T]) -> bool {
let mut i = a.len() - 2;
loop {
if a[i] < a[i + 1] {
break;
}
if i == 0 {
return false;
}
i -= 1;
}
let mut j = a.len() - 1;
while !(a[j] > a[i]) {
j -= 1;
}
(a[i], a[j]) = (a[j], a[i]); reverse(a, i + 1, a.len() - 1); true
}
fn reverse<T: Copy>(a: &mut [T], i: usize, j: usize) {
let mut i = i;
let mut j = j;
while i < j {
(a[i], a[j]) = (a[j], a[i]); i += 1;
j -= 1;
}
}
#[cfg(test)]
mod tests {
use super::*;
use lexicographically_next_permutation as next_perm;
#[test]
fn lexicographically_next_permutation_test1() {
let mut v = ['a', 'b', 'c'];
next_perm(&mut v);
assert_eq!(v, ['a', 'c', 'b']);
next_perm(&mut v);
assert_eq!(v, ['b', 'a', 'c']);
next_perm(&mut v);
assert_eq!(v, ['b', 'c', 'a']);
next_perm(&mut v);
assert_eq!(v, ['c', 'a', 'b']);
next_perm(&mut v);
assert_eq!(v, ['c', 'b', 'a']);
let status = next_perm(&mut v);
assert_eq!(status, false);
}
#[test]
fn lexicographically_next_permutation_test2() {
let mut v = vec!['C', 'A', 'D', 'B'];
next_perm(&mut v);
assert_eq!(v, vec!['C', 'B', 'A', 'D']);
let mut v = [1, 2, 9, 6, 5];
next_perm(&mut v);
assert_eq!(v, [1, 5, 2, 6, 9]);
}
}