全排序c++

全排序
例如 给出三个数123,进行全排序。
得到 123 132 213 231 312 321,共六种排法。
算法思路
对1,2,3,4,四个数进行全排列的过程如下:
a)首先保持数字1不动,对2,3,4进行全排列
b)保持2不动,对3,4进行全排列;
c)保持3不动,对4进行全排列,4只有一个数,所以得到的排列只有一种:1234。
d)回退回来,3不可不变了,继续保持2不变,4和3互换保持4不变,得到排列1243。
e)以12不动的排列完成,接下来将3和2互换,继续以上步骤的操作。

由以上过程得到:
将n个数的全排列化为n个同样规模的小问题的全排列,则每个数自己都是一个全排列。也就是分治算法。先划分,再解决,最后结合在一起。
不考虑大象是否能装进冰箱,只考虑装进去的步骤。
看不懂也没关系,我自己也不是很理解。
直接理解代码就好。

#include<iostream>
using namespace std;
void permutation(int list[],int begin,int end){
    
    
	if(begin<end){
    
    
		for(int i=begin;i<=end;i++){
    
    
			swap(list[begin],list[i]);//将每个数交换到前面固定 
			permutation(list,begin+1,end);//对剩下的n-1个数字进行全排序 
			swap(list[begin],list[i]);//将交换过来的数交换回去 
		}
	}
	else{
    
    
		for(int j=1;j<=end;j++){
    
    
			cout<<list[j];
		}
		cout<<endl;
	} 
}
int main(){
    
    
	int n;
	cout<<"要排列的数n(从数字1到n):"<<endl; 
	cin>>n;
	int list[n];
	for(int i=1;i<=n;i++){
    
    
		list[i]=i;
	}
    permutation(list,1,n);
}

字符的全排序将上面代码做一些改动即可。

#include<iostream>
using namespace std;
void permutation(char list[],int begin,int end){
    
    
	if(begin<end){
    
    
		for(int i=begin;i<=end;i++){
    
    
			swap(list[begin],list[i]);//将每个数交换到前面固定 
			permutation(list,begin+1,end);//对剩下的n-1个数字进行全排序 
			swap(list[begin],list[i]);//将交换过来的数交换回去 
		}
	}
	else{
    
    
		for(int j=0;j<=end;j++){
    
    
			cout<<list[j];
		}
		cout<<endl;
	} 
}
int main(){
    
    
//	int n;
//	cout<<"要排列的数n(从数字1到n):"<<endl; 
//	cin>>n;
//	int list[n];
//	for(int i=1;i<=n;i++){
    
    
//		list[i]=i;
//	}
    char list[]={
    
    'a','b','c','d'};
    permutation(list,0,3);
}

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_46606018/article/details/114787813