1. 正序(从后向前)
2. 找大(从后向前)
3. 调换 ()
4. 置逆()
public class Test
{
static int a[] = {1, 2, 3, 4};
public static void main(String args[])
{
int cnt = 0;
do
{
for (int i = 0; i < 4; ++i)
System.out.print(a[i] + " ");
System.out.println();
++cnt;
}while (next_permunatation(0, 4));
System.out.println("cnt = " + cnt);
}
public static boolean next_permunatation(int first, int last)
{
if (first == last) return false; // empty
int i = first;
++i;
if (i == last) return false; // one element
i = last;
--i;
for (;;) // 以下,锁定一组相邻元素
{
int ii = i;
--i;
if (a[i] < a[ii]) // 如果前一个元素小于后一个元素(元素相邻)
{
int j = last;
while (! (a[i] < a[--j])) ; // 由尾端往前找,直到遇上比*i大的元素
swap(i, j);
reverse(ii, last);
return true;
}
if (i == first)
{
reverse(first, last);
return false;
}
}
}
public static void swap(int first, int last)
{
int tmp = a[first];
a[first] = a[last];
a[last] = tmp;
}
public static void reverse(int first, int last)
{
while (first <= --last)
{
swap(first, last);
first++;
last--;
}
}
}