您的位置:首页 > 其它

整数全排列(旋转法,next_permutation)

2015-05-29 21:59 183 查看
读了《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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: