输入正数n,按字典序从小到大的顺序输出n个数的所有排列。两个序列的字典序大小关系等价于从头开始第一个不相同位置处的大小关系。
思路:
void print_permutation(序列A,集合S)
{
if ( S 为空 ) 输出序列 A;
else 按照从小到大的顺序依次考虑 S 的每个元素 v
{
print_permutation(在A的末尾添加v后得到的新序列,S-{v});
}
}
Code:
#include<stdio.h> #include<stdlib.h> void print_permutation(int n, int *A, int cur); int A[10]; int main() { print_permutation(10,A,0); system("pause"); return 0; } void print_permutation(int n, int *A, int cur) { if(cur==n) { for(int i=0;i<n;++i) printf("%d ",A[i]); printf("\n"); } else for(int i=1;i<=n;++i) { int ok=1; for(int j=1;j<cur;++j) if(i==A[j]) ok=0; if(ok) { A[cur]=i; print_permutation(n,A,cur+1); } } }
在一的基础上,首先要对输入数组P进行排序;再者一中元素不重复而这里可以重复,要统计次数;第三,对于输入1 1 1,只输出一次而不是多次,即对连续的相同元素,不能多次出现。
Code:
#include<stdio.h> #include<stdlib.h> int cmp_int(const void *_a, const void *_b); void print_permutation2(int n, int *P, int *A, int cur); int P[]={1,2,3,3,2,1,4}; int A[7]; int main() { int n=7; qsort(P,7,sizeof(P[0]),cmp_int); print_permutation2(n,P,A,0); system("pause"); return 0; } void print_permutation2(int n, int *P, int *A, int cur) { if(cur==n) { for(int i=0;i<n;++i) printf("%d ",A[i]); printf("\n"); } else for(int i=0;i<n;++i)//遍历数组P的所有元素 if(!i||P[i]!=P[i-1])//连续的相同元素不枚举多次 { int c1=0,c2=0; for(int j=0;j<cur;++j) if(P[i]==A[j]) c1++;//P[i]在A数组中已出现的次数 for(int j=0;j<n;++j) if(P[i]==P[j]) c2++;//P[i]在P数组中共出现的次数 if(c1<c2) { A[cur]=P[i]; print_permutation2(n,P,A,cur+1); } } } int cmp_int(const void *_a, const void *_b) { return *(int*)_a - *(int*)_b; }
C++的STL中一个库函数 next_permutation()
Code:
#include<cstdio> #include<cstdlib> #include<algorithm> using namespace std; int main() { int n,p[10]; scanf("%d",&n); for(int i=0;i<n;++i) scanf("%d",&p[i]); sort(p,p+n); do { for(int i=0;i<n;++i) printf("%d ",p[i]);//输出排列p printf("\n"); }while(next_permutation(p,p+n)); system("pause"); return 0; }
原文:http://blog.csdn.net/buxizhizhou530/article/details/43958399