读了《C语言名题精选百则技巧篇》中的整数全排列,里面的算法是多样丰富的。看了旋转的基本思路和已经知道的最易用的next_permutation(),自己把两者都实现并且运行了一遍。只有不断学习,观察,猜想,推敲,实践才有可能弄懂算法的奥义。两种方式都产生相同数目的排列,但是次序是不同的。
旋转:
#include <iostream>
#include<cstdio>
using namespace std;
int A[5]={1,2,3,4,5};
void show(){
for(int i=0;i<5;i++){
printf("%d ",A[i]);
}
cout<<endl;
}
void rotate(int dex){
int t=A[dex],i;
for(i=dex+1;i<5;i++){
A[i-1]=A[i];
}
A[4]=t;
}
int main(int argc, char *argv[]) {
int dex=0,index=0,sum=0;
while(dex<4){
rotate(index);
show();
sum++;
dex=index;
while(A[dex]==dex+1&&dex!=4){
dex++;
rotate(dex);
}
}
cout<<"sum= "<<sum<<endl;
return 0;
}
next_permutation():
#include <iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int A[5]={1,2,3,4,5};
void show(){
for(int i=0;i<5;i++){
printf("%d ",A[i]);
}
cout<<endl;
}
int main(){
int sum=0;
do{
show();
sum++;
}while(next_permutation(A,A+5));
cout<<"sum= "<<sum<<endl;
return 0;
}