#include<stdio.h>
void perm(int *array,int a,int b);
void swap(int *a,int *b);
int main(){
int array[4]={1,3,5,6};
perm(array,0,3);
int i;
for(i=0;i<=3;i++){
printf("%d ",array[i]);
}
return 1;
}
void perm(int *array,int a,int b){
if(a==b){
int i;
for(i=0;i<=b;i++){
printf("%d ",array[i]);
}
printf("\n");
}else{
int k;
for(k=a;k<=b;k++){//循环求出array[a]该数为基数各数位上全排列
swap(&array[a],&array[k]);//array[a]与之后各数位上的数交换,很多博客上面写swap(&array[0],$array[k]);这是错误的写法,运行后你就知道
perm(array,a+1,b);//递归分治求出子数组的全排列
swap(&array[a],&array[k]);//将之前交换的数复位,保持原数组的数的顺序
}
}
}
void swap(int *a,int *b){
int temp=*a;
*a=*b;
*b=temp;
}