123
132
213
231
321
312
不断的把数组中的首位分割开,最终实现全排列
这里传的是数组,但是操作是在同一个数组操作的,意思就是交换操作是全局的,同时把这个改变过后的结果传个了下一次迭代,但是输出完元素后,程序又进行了一次交换,即自动恢复了对数组的交换,所以我们可以检验最后数组的输出情况,不出意外应该是和原数组一样的结果 。
注意:
此处没有保证从小到大的全排列,因为按照这种规则,则需要先输出312,再输出321。
#include<cstdio>
void swap(int A[], int i, int j){
int temp = A[i];
A[i] = A[j];
A[j] = temp;
}
void printArray(int A[], int n){
int i;
for(i =0; i<n; i++){
printf("%d ",A[i]);
}
printf("\n");
}
void permutation(int A[], int p, int q){
if(p == q){
printArray(A, q+1);
}
int i;
for(i=p; i<=q; i++){
swap(A, p, i);
permutation(A, p+1, q);
swap(A, p, i);
}
}
int main(){
int A[]={1,2,3};
permutation(A,0,2);
return 0;
}