一、全排列概念
从n个数中选取m(m<=n)个数按照一定的顺序进行排成一个列,叫作从n个元素中取m个元素的一个排列。由排列的定义,显然不同的顺序是一个不同的排列。从n个元素中取m个元素的所有排列的个数,称为排列数。从n个元素取出n个元素的一个排列,称为一个全排列。全排列的排列数公式为n!,通过乘法原理可以得到。
比如:123的全排列是123、132、213、231、312、321 本文用暴力算法求解5个数的全排列,更好的优化算法,见后续博文
二、代码
法一
1 #include <stdio.h> 2 #include <time.h> 3 4 int main(int argc, char *argv[]) 5 { 6 // 对5个数 进行全排列 7 int a,b,c,d,e; 8 float start,finish; 9 start = clock(); 10 for(a=1;a<=5;++a) 11 for(b=1;b<=5;++b) 12 for(c=1;c<=5;++c) 13 for(d=1;d<=5;++d) 14 for(e=1;e<=5;++e) 15 if(a!=b && a!=c && a!=d && a!=e 16 && b!=c && b!=d && b!=e 17 && c!=d && c!=e 18 && d!=e) 19 printf("%d%d%d%d%d ",a,b,c,d,e); 20 finish = clock(); 21 printf("总耗时:%.5fs ",(finish-start)/1000); 22 return 0; 23 }
运行结果:
法二、
1 #include <stdio.h> 2 #include <time.h> 3 4 int main(int argc, char *argv[]) 5 { 6 // 对5个数 进行全排列 7 int a[6]; // 存放5位数 8 int sum,flag[6],i; 9 float start,finish; 10 start = clock(); 11 for(a[1]=1;a[1]<=5;++a[1]) 12 for(a[2]=1;a[2]<=5;++a[2]) 13 for(a[3]=1;a[3]<=5;++a[3]) 14 for(a[4]=1;a[4]<=5;++a[4]) 15 for(a[5]=1;a[5]<=5;++a[5]) 16 { 17 for(i=1;i<=5;++i) // 初始化flag数组 18 flag[i] = 0; 19 for(i=1;i<=5;++i) // 如果某个数出现过就标记一下 20 flag[a[i]]=1; 21 sum = 0; 22 for(i=1;i<=5;++i) 23 sum += flag[i]; 24 // 如果恰好出现了5个不同的数,并且满足条件,则输出 25 if(sum==5) 26 { 27 printf("%d%d%d%d%d ",a[1],a[2],a[3],a[4],a[5]); 28 } 29 } 30 31 finish = clock(); 32 printf("总耗时:%.5fs ",(finish-start)/1000); 33 return 0; 34 }
运行结果:
第二种方法在第一种的思路上,多了一个标记,这样在if语句中少做一些比较,节约时间
关于更高的效率,后续博文继续探讨