Алгоритм может быть таким:
1. Идешь с конца массива, ищешь элемент, который меньше предыдущего
(если смотреть справа)
2. В оставшейся части справа ищешь такой элемент, который больше найденного, но, при этом меньше всех остальных.
3. Этот элемент меняешь местами с найденным элементом.
4. Сортируешь по неубыванию оставшуюся правую часть.
Исходники можно посмотреть тут (но не вчитывался в алгоритм, не знаю, какой там подход реализован):
http://algolist.manual.ru/maths/comb...rmutations.php