Они уже подумали об этом для вас:
#include <algorithm>
int ra[6] = { 1, 2, 3, 4, 5, 6 };
do {
// whatever
} while (std::next_permutation(ra, ra+6));
Обратите внимание, что элементы должны начинаться в порядке возрастания (путем сравнения через оператор <), иначе цикл завершится до того, как вы увидите каждую перестановку. Подробнее см. <a href="http://en.cppreference.com/w/cpp/algorithm/next_permutation" rel="nofollow noreferrer">http://en.cppreference.com/w/cpp/algorithm/next_permutation.
Вероятно, он не дает максимально возможного времени выполнения, потому что на каждом шаге он должен проверять массив, чтобы определить, что изменить. Но это, безусловно, самый эффективный в программистских усилиях, и, не зная компилятора и платформы, в любом случае невозможно микрооптимизировать подходы с вложенными циклами.