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;
}