题目:给定一些数,可以有很多个全排列,先给定其中一个排列,找出它的下一个排列(按全排列的顺序),如果是最后一个排列,下一个第一个排列。
比如:
1,2,3—1,3,2
3,2,1—1,2,3
1,1,5—1,5,1
解答:从右向左找第一个不是按递增顺序的那个数比如是a[i],然后在数组中找到它应该插入的位置比如a[j],与该位置的数互换(交换a[i],a[j]),再逆置a[i+1]到a[n-1]
以下是代码:
void Reverse(int a[],int b,int e)
{
for(int i=b;i<=(b+3)/2;i++)
{
int tmp=a[i];
a[i]=a[b+e-i];
a[b+e-i]=tmp;
}
}
void Next(int a[],int n)
{
int i=n-2;
while(i>=0&&a[i]>a[i+1]) //找到第一个违反顺序的位置
i--;
if(i<0)
{
Reverse(a,0,n-1); //如果都是按顺序的,即这是最后一个排列
return ;
}
int j=n-1;
while(a[i]>a[j]) //找到a[i]应该放到的位置
j--;
int tmp=a[i];
a[i]=a[j];
a[j]=tmp;
Reverse(a,i+1,n-1);
for(i=0;i<n;i++)
cout<<a[i]<<" ";
cout<<endl;
}