假设数组的全排列结果是按升序(或者降序)排列的,对于全排列中的一种情况,求下一个排列情况
如:
输入:a = {5,2,4,3,1}
输出:a = {5,3,1,2,4}
算法思路,从后向前遍历数组,比较相邻的两个元素(i,j,i<j),寻找升序(或者降序)的a[i]<a[j]。如果没找到,说明已经是最后一中情况则终止算法;如果找到,则再次从数组结尾遍历,找到第一个大于(或者小于a[i])的元素a[k](k可能==j),交换a[i]和a[k],在将包括a[j]在内到结尾的数组逆置,即可。
#include<iostream>
#include<stdlib.h>
using namespace std;
template<typename T>
void next_pailie(T
*a,T *& next,int len)
*a,T *& next,int len)
{
int i,j;
bool flag;
next = new T[len];
for(i=0;i<len;++i)
next[i] = a[i];
for(i=len-1;i>0;--i)
{
j = i-1;
if(next[j]<next[i])
break;
}
next[i] = next[i]^next[j];
next[j] = next[i]^next[j];
next[i] = next[i]^next[j];
for(i=i+1,j=1;i<len;++i,++j)
{
if(i
>= len-j)
>= len-j)
break;
next[i] = next[i]^next[len-j];
next[len-j] = next[i]^next[len-j];
next[i] = next[i]^next[len-j];
}
}
int main()
{
int i;
const int len
= 5;
= 5;
char a[len]
= {'a' ,'c', 'e','d' ,'b'};
= {'a' ,'c', 'e','d' ,'b'};
char *b;
next_pailie(a,b,5);
for(i=0;i<len;++i)
cout<<b[i]<<endl;
delete[]
b;
b;
system( "pause");
return 0;
}