#include <iostream>
using namespace std;
template <class T>
void swap(T *a, T *b)
{
T tmp = *a;
*a = *b;
*b = tmp;
}
template <class T>
void reverse(T *src, int i, int j)
{
for (;i<j;i++,j--)
swap(&src[i], &src[j]);
}
template <class T>
void nextPerm(T* src, int length)
{
int count = 0;
if (length < 2) return;
while (true)
{
count++;
for (int k = 0; k < length; ++k)
cout << src[k] << " ";
cout << endl;
int i, j;
for (i = length -2; i >=0; --i)
{
if (src[i] < src[i+1]) break;
if (i == 0)
{
cout << count << endl;
return;
}
}
for (j = length-1; j > i; --j)
{
if (src[j] > src[i]) break;
}
swap(&src[i], &src[j]);
reverse(src, i+1, length-1);
}
}
int main()
{
char arr[] = "abc";
nextPerm(arr, 3);
int a[] = {1,2,3,4,5};
nextPerm(a, 5);
return 0;
}