求n个元素的全排列数量
盗一张网上的图
方法如下
n!=n*(n-1)!=n*(n-1)*(n-2)!
- 设a[n],i=1~n;
- a[ 1 ]与a[ i ]交换
- a[ 2 ]~a[ n ]中n-1个元素全排列
- a[ 1 ]与a[ i ]交换,恢复之前状态
- 再进行a[ 2 ]相同的步骤,只有1个元素的时候输出。
#include <stdio.h>
#include <stdlib.h>
int main(){
int arr[]={1,2,3,4};
perm(arr,1,9);
return 0;
}
//求第k-n个元素的全排列
int perm(int list[],int k,int n){
int i;
if(k==n){
for(i=0;i<=n;i++){
printf("%d",list[i]);
}
printf("\n");
}
else{
for(i=k;i<=n;i++){
swap(list,k,i);//轮流做第k个
perm(list,k+1,n);//求剩下的全排列
swap(list,k,i);//恢复原位置
}
}
}
int swap(int list[],int k,int i){
int t;
t=list[k],list[k]=list[i],list[i]=t;
}