Надо упорядочить все перестановки в лексикографическом порядке (имеется в виду запись перестановки как 

, где 

-й элемент переходит на место 

), а потом явно указать правило перехода к следующей перестановке. Правило такое:
Находим ближайшую к концу пару элементов, в котором следующий элемент меньше предыдущего (пусть это пара 

), теперь переставляем элементы с 

-го по 

-ый в таком порядке: на 

-е место ставим наименьший элемент, больший 

, а остальные располагаем в порядке возрастания.
Начинается перебор перестановок с тождественной, заканчивается перестановкой вида 

P.S. Если программируете на C++, то в STL есть функция next_permutation(), которая самостоятельно проделывает все вышеописанное.