Welcome 微信登录

首页 / 操作系统 / Linux / C++编程实例:全排列

1、将一个n维数组初始化,第0位填1,第1位填2.。。。。。 第n-1位填n; 2、将数组看为两部分,一个是已排好的,剩下是待排的,分别用两个指针指向; 3、将第一个字符,依次与后n-1个字符交换值,每次交换得到一个新的首数字; 4、剩下的n-1个数字按2、3步骤重复直至所有数组完成排列; 使用c++实现,代码还有些繁琐,明天再仔细看看优化一下 代码 1 #include<iostream> 2 using namespace std; 3 4 void swap(int *p1,int *p2) 5 { 6     //交换p1和p2指向的值 7     int tmp=*p1; 8     *p1=*p2; 9     *p2=tmp; 10 } 11 void output(int *p,int n) 12 { 13     while(n>0) 14     { 15         cout<<*p; 16         p++; 17         n--; 18     } 19     cout<<" "; 20 } 21 22 void fill(int *p1,int *p2,int len,int n) 23 {//p1指向已填满的部分,始终指向第一个; 24     //p2指向尚余下的部分,待插入那个; 25     //len表示已填部分的长度,n表示数组长度 26     if(len==n-1) 27         { 28             output(p1,n);//输出全部数组 29         } 30     else 31     { 32         int *p3,*p4; 33         int *pp=(int *)malloc(n*sizeof(int)); 34         for(int i=0;i<n;i++) 35         { 36             *(pp+i)=*(p1+i); 37         } 38         p3=pp; 39         while(*p3!=*p2) 40         { 41             p3++; 42         } 43         p4=p3; 44 45         for(int i=0;i<n-len;i++) 46         { 47             swap(p3,p4); 48             p4++; 49             fill(pp,p3+1,len+1,n); 50         } 51     } 52 } 53 54 void inti(int *p,int n) 55 {//将数组中所有的元素全部初始化, 56     int num=1; 57     while(num<=n) 58     { 59         *p=num++; 60         p++; 61         //cout<<num<<endl; 62     } 63 } 64 65 int main() 66 { 67     int *p,n; 68     cout<<"请输入全排列规模:"; 69     cin>>n; 70     p=(int *)malloc(n*sizeof(int)); 71     inti(p,n); 72     fill(p,p,0,n); 73     return 0; 74 }