排列问题:
一.递归法
(一)数据中无重复的
#include<stdio.h>
#include<string.h>
void perm(int *a, int p, int q);
void swap(int arr[], int a, int b);
int main()
{
int n,i;
scanf("%d",&n);
int a[i];
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
perm(a,0,n-1);
return 0;
}
void perm(int *a, int p, int q)
{
int i;
if(p==q) //递归出口
{
for(i=0;i<=q;i++)
{
printf("%d",a[i]);
}
}
else
{
for(i=p;i<=q;i++)
{
swap(a,p,i); //把每个元素拿到第一个位置
perm(a,p+1,q); //对n-1个元素进行全排列
swap(a, p,i); //换回来
}
}
}
void swap(int arr[], int a, int b)
//交换数组中下标为a和b的两个数
{
int temp = arr[a];
arr[a] = arr[b];
arr[b] = temp;
}
递归树状图,详见:
尤其要注意有for循环在外面的递归(一遇上这种,我总是想不明白,当作不同的分支)
<a href="(3条消息) 全排列的递归算法(C语言)_苍之羽的博客-CSDN博客_c语言递归求全排列" target="_blank">苍之羽代码</a>
(二)数据中有重复的
而去重的全排列就是从第一个数字起每个数分别与它后面非重复出现的数字交换。用编程的话描述就是第i个数与第j个数交换时,要求[i,j)中没有与第j个数相等的数。
代码参考了<a href="(3条消息) 全排列的递归算法(C语言)_苍之羽的博客-CSDN博客_c语言递归求全排列" target="_blank">苍之羽代码</a>