**
7-2 输出全排列 (20 分)
**
请编写程序输出前n个正整数的全排列(n<10),并通过9个测试用例(即n从1到9)观察n逐步增大时程序的运行时间。
输入格式:
输入给出正整数n(<10)。
输出格式:
输出1到n的全排列。每种排列占一行,数字间无空格。排列的输出顺序为字典序,即序列a1,a2,⋯,an排在序列b1,b2,⋯,bn之前,如果存在k使得a1=b1,⋯,ak=bk
并且 ak+1<bk+1。
输入样例:
3
输出样例:
123
132
213
231
312
321
代码部分
#include <stdio.h>
#define YES 1
#define NO 0
int order[10],is_mark[10],n;
//在此使用全局变量,数组order用来存储排序组合,数组is_mark用来标记某一个数是否在排序里被用过,默认没用过(NO)
//注意:函数初始化不要忘
void recursion(int k)
//递归函数思路:传入的参数k用于表示待填入数字的位序,先判断该位置是否合理(有没有超过n)不合理就输出全部,
//合理就往该位置处填入数字,填完之后,递归调用填下一个位置的数。
{
int i;
//判断。。不合理就代表能填的位置都已经填完了,直接将序列输出就可以了
if (k>n){
for (i=1;i<n;++i)printf("%d",order[i]);
printf ("%d\n",order[n]);
return ;
}
//否则(合理)就进行往里面填数操作
else {
for (i=1;i<=n;++i){//该for循环用于不断从1开始试每一个数
if (!is_mark[i]){//is-mark数组记录的是数i有没有被用过。
order[k]=i;is_mark[i]=YES;// 如果没有被用过,就将i填入k位置处,将i标记为已经使用
recursion(k+1);//递归调用,用于填入下一个位置(k+1)的值
order[k]=0;is_mark[i]=NO;//调用结束后把该位置空出来,原来用过的数也取消标记
}
}
}
}
int main ()
{
scanf ("%d",&n);
recursion(1);
return 0;
}
本文代码根据该博主的代码改编而来,详情请戳https://blog.csdn.net/weixin_43891469/article/details/85385759