N个数全排列的非递归算法

//N个数全排列的非递归算法   
#include"stdio.h"   
void swap(int &a, int &b)   
{   
    int temp;   
    temp = a;   
    a = b;   
    b = temp;   
}   
/*   
根据当前的排列p,计算下一个排列。   
原则是从1234–>4321,若p已经是最后一个排列,传回false,否则传回true。   
p是一个n维向量。   
*/   
bool nextPermutation(int *p, int n)   
{   
    int last=n-1;   
    int i,j,k;   
    //从后向前查找,看有没有后面的数大于前面的数的情况,若有则停在后一个数的位置。   
    i=last;   
    while(i>0&&p[i]<p[i-1])   
        i--;   
    //若没有后面的数大于前面的数的情况,说明已经到了最后一个排列,返回false。   
    if(i==0)   
        return false;   
    //从后查到i,查找大于p[i - 1]的最小的数,记入k   
    k=i;   
    for(j=last;j>=i;j--)   
        if(p[j]>p[i-1]&&p[j]<p[k])   
            k =j;   
        //交换p[k]和p[i - 1]   
        swap(p[k],p[i-1]);   
        //倒置p[last]到p[i]   
        for (j =last,k =i;j>k;j--,k++)   
            swap(p[j],p[k]);   
        return true;   
}   
//显示一个排列   
void showPermutation(int *p, int n)   
{   
    for(int i=0;i<n;i++)   
        printf("%d ",p[i]);   
    printf("
");  
}   
int main(int argc, char *argv[])   
{   
    int n;   
    int *p;   
    scanf("%d",&n);   
    p = new int[n];   
    for (int i = 0; i < n; i++)   
        p[i] = i + 1;   
    showPermutation(p, n);   
    while(nextPermutation(p, n))   
    {   
        showPermutation(p, n);   
    }   
    //delete[] p;   
    return 0;   
}  
 

//本文出自 “阿凡达” 博客,请务必保留此出处
//http://shamrock.blog.51cto.com/2079212/702551
积跬步以致千里,积小流以成江海。
2016年5月之前的博文发布于51cto,链接地址:shamrock.blog.51cto.com
2016年5月之后博文发布与cnblogs上。
Github地址 https://github.com/umgsai
Keep moving~!!!
原文地址:https://www.cnblogs.com/umgsai/p/3908238.html