全排列输出 c语言
输出n的全排列,排列输出按照字典序
递归总是觉得越学越不懂啊...
#include<stdio.h> void swap(int *a,int *b){ //交换 int t; t=*a; *a=*b; *b=t; } void copy(int s,int e,int *arr1,int *arr2){ //复制数组 现在想想感觉用strcpy好像也行? int i; for(i=s;i<=e;i++) arr1[i]=arr2[i]; } void farr(int *arr,int s,int e){ //farr可以输出arr数组中从s到e的全排列 int i; int tem[10]; if(s==e){ for(i=0;i<=e;i++) printf("%d",arr[i]); printf("\n"); return; } else{ for(i=s;i<=e;i++){ //依次将第i个元素与首元素交换
//每次交换后需要记录之前的顺序,
//如123,213,312就是先把1与1交换得到123,记录,输出后面元素的全排列,
//恢复至123,再将12交换得到213,记录,输出后面元素的全排列,恢复至213,
//再将23交换得到312,记录,输出后面元素的全排列 swap(&(arr[s]),&(arr[i]));交换 copy(s,e,tem,arr);//存储此处数组用于复原 farr(arr,s+1,e);//输出首元素后面元素的全排列 copy(s,e,arr,tem);//复原数组 } return; } } int main(){ int i,n; int arr[10]; scanf("%d",&n); for(i=0;i<=n-1;i++) arr[i]=i+1; farr(arr,0,n-1); return 0; }

浙公网安备 33010602011771号