现在的位置: 首页 > 综合 > 正文

字典序求全排列的下一种情况

2014年01月06日 ⁄ 综合 ⁄ 共 1388字 ⁄ 字号 评论关闭
假设数组的全排列结果是按升序(或者降序)排列的,对于全排列中的一种情况,求下一个排列情况

如:
输入: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)
{
             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)
                                     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;
             char a[len]
= {
'a' ,'c', 'e','d' ,'b'};
             char *b;
             next_pailie(a,b,5);
             for(i=0;i<len;++i)
                        cout<<b[i]<<endl;
             delete[]
b;
            system( "pause");
             return 0;
}

抱歉!评论已关闭.